무료 UML Tools 소개
PlantUML - Script로 UML을 그릴수 있는 무료 툴
http://plantuml.com/
'Coding > 좋은 사이트' 카테고리의 다른 글
| 무료 에디터 (1) | 2017.07.27 |
|---|---|
| 추천 사이트 모음 (4) | 2010.03.16 |
| 자바 스크립트로 만든 운영체제 (0) | 2006.11.13 |
무료 UML Tools 소개
PlantUML - Script로 UML을 그릴수 있는 무료 툴
http://plantuml.com/
| 무료 에디터 (1) | 2017.07.27 |
|---|---|
| 추천 사이트 모음 (4) | 2010.03.16 |
| 자바 스크립트로 만든 운영체제 (0) | 2006.11.13 |
Sub OpenFile() Dim chooseFileName As Variant chooseFileName = Application.GetOpenFilename(FileFilter:="XML Files(*.xml), *.xml", Title:="Select XML file") If chooseFileName <> False Then Debug.Print chooseFileName Else Exit Sub End If End Sub |
| windows 에서 pop띄우기 (0) | 2017.06.15 |
|---|---|
| [PHP] 서버에 접속한 장치의 IP 얻기 (0) | 2011.01.19 |
| BASIC의 추억 (0) | 2007.04.04 |
<HTML>
<head>
<title>Chobocho's Simple Calculator</title>
<style>
.tile {
text-align:center;
width:40px;
height:40px;
font-size:24px;
background-color:"white";
border:1px solid black;
box-shadow:black 1px 1px;
}
textarea {
height:100px;
width:200px;
text-align:right;
font-size:24px;
border:1px solid black;
box-shadow:black 1px 1px;
padding:2px;
}
</style>
<script language="JavaScript">
var sum = 0;
var ret = "";
var keypadValue = [ "AC", "←", "(", ")", "7", "8", "9", "÷", "4", "5", "6", "×", "1", "2", "3", "-", "0", ".", "=", "+" ];
function init() {
var table = document.getElementById("keypad");
window.onkeydown = onKeyDown;
window.onkeyup = onKeyUp;
for (var i = 0; i < 5; i++) {
var tr = document.createElement("tr");
for (var j = 0; j < 4; j++) {
var td = document.createElement("td");
td.className="tile";
var idx = i*4 + j;
td.value = idx;
td.index = idx;
td.textContent = keypadValue[idx];
td.onclick = onClick;
tr.appendChild(td);
}
table.appendChild(tr);
}
}
function onKeyUp(e) {
}
function onKeyDown(e) {
}
function onClick(e) {
var clkTile = e.srcElement.index;
var isClickEqual = false;
switch(clkTile) {
case 0 : // AC
sum = 0;
ret = "";
break;
case 1 : // <-
ret = ret.slice(0,-1);
break;
case 2 : // (
case 3 : // )
case 4 : // 7
case 5 : // 8
case 6 : // 9
case 7 : // ÷
case 8 : // 4
case 9 :
case 10 :
case 11 : // x
case 12 :
case 13 :
case 14 :
case 16 : // 0
case 19 : // +
ret = ret + keypadValue[clkTile];
break;
case 15 : // -
if (ret == "") {
ret = "-";
} else {
ret = ret + "-";
}
break;
case 17 : // .
if (ret == "") {
ret = "0.";
} else {
ret = ret + ".";
}
break;
case 18 : // =
if (ret == "" && sum != 0) {
ret = sum;
} else {
ret = ret.replace(/×/g, "*").replace(/÷/g, "/");
try {
sum = eval(ret);
} catch(e) {
sum = "Error";
}
ret = "";
}
isClickEqual = true;
break;
default:
break;
}
console.log("Exp : " + ret + " Sum : " + sum);
document.getElementById("result").value = isClickEqual ? sum : ret;
}
</script>
</head>
<body onload="init()">
<table id="keypad" align="center">
<tr>
<td colspan=4>
<textarea id="result" disabled=true cols="35" rows="1"></textarea>
</td>
</tr>
</table>
</body>
</HTML>
| Puzzle game (0) | 2017.01.22 |
|---|---|
| Clock (0) | 2016.10.25 |
| Puzzle (0) | 2016.10.25 |
<html>
<head>
<title> My Clock </title>
<script language="JavaScript">
// 2016.10.10
var cvs;
var clockWidth = 200;
function init() {
var canvas = document.getElementById("canvas")
cvs = canvas.getContext("2d");
drawPanel();
tick();
setInterval(tick, 1000);
}
function drawPanel() {
// Draw panel
cvs.strokeStyle = "black";
var width = clockWidth/2;
for (var i = 0; i < 12; i++) {
cvs.beginPath();
var r = Math.PI / 6 * i;
var size = 0.9;
cvs.moveTo(width + width * size * Math.sin(r), width + width * size * Math.cos(r));
cvs.lineTo(width + width * Math.sin(r), width + width * Math.cos(r));
cvs.closePath();
cvs.stroke();
}
}
function drawClock() {
var width = clockWidth/2;
cvs.strokeStyle = "black";
var currentTime = new Date();
var h = currentTime.getHours() % 12;
var m = currentTime.getMinutes();
var s = currentTime.getSeconds();
if ( s === 0 ) {
cvs.fillStyle = "white";
cvs.fillRect(0, 0, clockWidth, clockWidth);
drawPanel();
}
cvs.beginPath();
var rh = Math.PI / 6 * h + Math.PI / 6 * ( m / 60 );
var sizeh = 0.6;
cvs.moveTo(width, width);
cvs.lineTo(width + width * sizeh * Math.sin(rh), width - width * sizeh * Math.cos(rh));
cvs.closePath();
cvs.stroke();
cvs.beginPath();
var rm = Math.PI / 30 * m;
var sizeM = 0.7;
cvs.moveTo(width, width);
cvs.lineTo(width + width * sizeM * Math.sin(rm), width - width * sizeM * Math.cos(rm));
cvs.closePath();
cvs.stroke();
cvs.beginPath();
var rs = Math.PI / 30 * s;
var sizeS = 0.9;
var sizeS2 = 0.95;
cvs.strokeStyle = "red";
cvs.moveTo(width + width * sizeS * Math.sin(rs), width - width * sizeS * Math.cos(rs));
cvs.lineTo(width + width * sizeS2 * Math.sin(rs), width - width * sizeS2 * Math.cos(rs));
cvs.closePath();
cvs.stroke();
document.getElementById("time").textContent = ((h < 10) ? "0":"") + h + ":" + ((m < 10) ? "0":"") + m + ":" + ((s < 10) ? "0":"") + s;
}
function tick() {
drawClock();
}
</script>
</head>
<body onload="init()">
<table border="0" align="center">
<tr>
<td>
<canvas id="canvas" width="200" height="200"> </canvas>
</td>
</tr>
<tr>
<td align="center">
<span id="time"></span>
</td>
</tr>
</table>
</body>
</html>
| Simple calculator (0) | 2016.10.28 |
|---|---|
| Puzzle (0) | 2016.10.25 |
| Timer (0) | 2016.09.29 |
<html>
<head>
<title> My Puzzle </title>
<style>
.tile {
text-align:center;
width:60px;
height:60px;
font-size:32px;
background-color:"white";
border:1px solid black;
box-shadow:black 2px 2px;
}
</style>
<script language="JavaScript">
// 2016.10.10
var tile = [];
var isPlay = false;
var emptyTile = 0;
function init() {
var table = document.getElementById("puzzle");
window.onkeydown = onKeyDown;
window.onkeyup = onKeyUp;
for (var i = 0; i < 5; i++) {
var tr = document.createElement("tr");
for (var j = 0; j < 5; j++) {
var td = document.createElement("td");
td.className="tile";
var idx = i*5 + j;
td.value = idx;
td.index = idx;
td.textContent = (idx === 0) ? "" : idx;
td.onclick = onClick;
tile.push(td);
tr.appendChild(td);
}
table.appendChild(tr);
}
alert("Click to Start!");
for (var i = 0; i < 1000; i++) {
onClick( {srcElement: {index : Math.floor(Math.random() * 25)}})
}
isPlay = true;
}
function onKeyDown(e) {
if (!isPlay) return;
var key = e.keyCode;
var emTile = emptyTile;
console.log("Key : " + key);
console.log("Empty Tile : " + emptyTile);
var x = emTile % 5;
var y = emTile / 5;
switch(key) {
case 37: // LEFT
if (x+1 < 5) {
moveTile(emptyTile+1);
}
break;
case 38: // UP
if (y+1 < 5) {
moveTile(emptyTile+5);
}
break;
case 39: // RIGHT
if (x-1 >= 0) {
moveTile(emptyTile-1);
}
break;
case 40: // DOWN
if (y-1 >= 0) {
moveTile(emptyTile-5);
}
break;
default:
console.log("Error : Never come to here!");
break;
}
}
function onKeyUp(e) {
}
function onClick(e) {
var clkTile = e.srcElement.index;
moveTile(clkTile);
}
function moveTile(clkTile) {
var x = clkTile % 5;
var y = clkTile / 5;
if (x-1 >= 0 && tile[clkTile-1].value == 0) {
swap(clkTile-1, clkTile);
emptyTile = clkTile;
}
else if (x+1 < 5 && tile[clkTile+1].value == 0) {
swap(clkTile+1, clkTile);
emptyTile = clkTile;
}
else if (y-1 >=0 && tile[clkTile-5].value == 0 ) {
swap(clkTile-5, clkTile);
emptyTile = clkTile;
}
else if (y+1 < 5 && tile[clkTile+5].value == 0) {
swap(clkTile+5, clkTile);
emptyTile = clkTile;
}
}
function swap(i, j) {
var tmpValue = tile[i].value;
var tmpContent = tile[i].textContent;
tile[i].value = tile[j].value;
tile[i].textContent = tile[j].textContent;
tile[j].value = tmpValue;
tile[j].textContent = tmpContent;
if (isFinish()) {
alert("Success");
}
}
function isFinish() {
for (var i = 0; i < 5; i++) {
for (var j = 0; j < 5; j++) {
var idx = i*5 + j;
if (idx == 24) {
return true;
}
else if (tile[idx].value != (idx+1)) {
return false;
}
}
}
return true;
}
</script>
</head>
<body onload="init()">
<table id="puzzle" align="center">
</table>
</body>
</html>
| Clock (0) | 2016.10.25 |
|---|---|
| Timer (0) | 2016.09.29 |
| Samll lisp by Javascript (0) | 2016.09.12 |
<html>
<head>
<title> Timer </title>
<script language="JavaScript">
// 2016. 9. 28
var timerId = NaN, mTime = 0;
function startTimer() {
mTime = document.getElementById("timer").value;
timerId = setInterval(tick, 1000);
document.getElementById("reset").disabled = true;
document.getElementById("start").disabled = true;
document.getElementById("stop" ).disabled = false;
document.getElementById("timer").disabled = true;
}
function stopTimer() {
clearInterval(timerId);
document.getElementById("reset").disabled = false;
document.getElementById("start").disabled = false;
document.getElementById("stop" ).disabled = true;
document.getElementById("timer").disabled = false;
}
function resetTimer() {
mTime = 0;
document.getElementById("timer").value = mTime;
}
function tick() {
mTime--;
document.getElementById("timer").value = mTime;
if (parseInt(mTime) <= 0) {
stopTimer();
alert("Time over!");
}
}
</script>
</head>
<body>
<table border=0 align="center">
<tr>
<td>
<button onClick="startTimer()" id="start" >Start</button>
<button onClick="stopTimer()" id="stop" disabled=true >Stop</button>
<button onClick="resetTimer()" id="reset" disabled=true >Reset</button>
</td>
</tr>
<tr>
<td>
<input id="timer"></input>
</td>
</tr>
</table>
</body>
</html>
| Puzzle (0) | 2016.10.25 |
|---|---|
| Samll lisp by Javascript (0) | 2016.09.12 |
| Chobocho Calc 1 (1) | 2016.04.23 |
(1..50).inject(1G) { result, i ->
println "$i! = ${result * i}"
result * i
}
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
14! = 87178291200
15! = 1307674368000
16! = 20922789888000
17! = 355687428096000
18! = 6402373705728000
19! = 121645100408832000
20! = 2432902008176640000
21! = 51090942171709440000
22! = 1124000727777607680000
23! = 25852016738884976640000
24! = 620448401733239439360000
25! = 15511210043330985984000000
26! = 403291461126605635584000000
27! = 10888869450418352160768000000
28! = 304888344611713860501504000000
29! = 8841761993739701954543616000000
30! = 265252859812191058636308480000000
31! = 8222838654177922817725562880000000
32! = 263130836933693530167218012160000000
33! = 8683317618811886495518194401280000000
34! = 295232799039604140847618609643520000000
35! = 10333147966386144929666651337523200000000
36! = 371993326789901217467999448150835200000000
37! = 13763753091226345046315979581580902400000000
38! = 523022617466601111760007224100074291200000000
39! = 20397882081197443358640281739902897356800000000
40! = 815915283247897734345611269596115894272000000000
41! = 33452526613163807108170062053440751665152000000000
42! = 1405006117752879898543142606244511569936384000000000
43! = 60415263063373835637355132068513997507264512000000000
44! = 2658271574788448768043625811014615890319638528000000000
45! = 119622220865480194561963161495657715064383733760000000000
46! = 5502622159812088949850305428800254892961651752960000000000
47! = 258623241511168180642964355153611979969197632389120000000000
48! = 12413915592536072670862289047373375038521486354677760000000000
49! = 608281864034267560872252163321295376887552831379210240000000000
50! = 30414093201713378043612608166064768844377641568960512000000000000
| Mac에서 Kotlin 설치하기 (0) | 2017.10.14 |
|---|---|
| Groovy 설치( Mac ) (0) | 2014.11.11 |
| Pocket PC를 위한 JVM (0) | 2005.09.28 |
Test : http://www.chobocho.com/javascript/lisp.html
Github : https://github.com/chobocho/SmallLisp
Javascript 로 만든 Small LIsp
자바스크립트를 공부하면서 간단한 lisp interpreter를 만들어 보기로 하고,
구글링을 통해서 찾은 사이트 http://norvig.com/lispy.html를 참고하여서 만들어 보았다.
아래 코드를 실행 하여 결과를 출력
(define pi 3)
(if (= pi 3) (+ 4 5) (* 4 5 ))
(define twice (lambda (x) (* 2 x)))
(twice 2)
(define forth (lambda (x) (* (twice x) (twice x))))
(forth 2)
(define fact (lambda (n) (if (<= n 1) 1 (* n (fact (- n 1))))))
(fact 16)
(fact (forth 2))
<HTML>
<head>
<title>Small lisp</title>
<script language="JavaScript" src="lisp.js"></script>
<script language="JavaScript">
function Run(form) {
form.result_view.value = main(form.source_view.value);
}
function ClearForm(form) {
form.result_view.value = "";
form.source_view.value = "";
}
</script>
</head>
<body>
<!------------------------------------------------------------------
// 입력양식
------------------------------------------------------------------->
<FORM name=source_code>
<TABLE cellSpacing=0 borderColorDark=white align=center borderColorLight=black border=1>
<TR>
<TD align="center">
[ Lisp source ]
</TD>
<TD align="center">
[ 결과 (Result) ]
</TD>
</TR>
<TR>
<TD width=160 height=40>
<SPAN style="FONT-SIZE: 9pt"><TextArea name="source_view" cols="50" rows="20"></textArea> </SPAN>
</TD>
<TD width=80 height=40>
<SPAN style="FONT-SIZE: 9pt"><TextArea name="result_view" cols="20" rows="20"></textArea> </SPAN>
</TD>
</TR>
<TR>
<TD align="center" width=246 colSpan=2 height=25>
<SPAN style="FONT-SIZE: 9pt"><INPUT type="button" value="Run", onClick="Run(this.form)"> </SPAN>
<SPAN style="FONT-SIZE: 9pt"><INPUT type="button" value="Clear", onClick="ClearForm(this.form)"> </SPAN>
</TD>
</TR>
<TR>
<TD width=240 colSpan=2>
Example<br>
(+ 1 2 3)<br>
</TD>
</TR>
</TABLE>
</FORM>
</body>
</HTML>
Javascript 학습을 목적으로 만든 것이이서 최소한의 명령어만을 지원한다.
먼저 (+ 5 5)를 처리하는 코드를 만들어 보자.
먼저 (+ 5 5)를 파싱을 해주어야 한다. 이때, 파서를 따로 제작하지 않고,
javascript string 객체에서 지원하는 메소드를 이용한다.
replace( /(/g, " ( " );
replace( /)/g, " ) " );
그러나, 구문 제일 앞의 ‘ (’ 와 ‘) ’의 스페이스는 trim()을 이용해 제거를 해주어야 한다.
그렇지 않으면, 파싱된 Token에 “ ”가 구문의 제일 앞과 뒤에 추가 된다.
이걸 정리하면 아래와 같은 코드가 나오고,
function main(args) {
//Tokenize
source_code = args.replace(/\(/g, " ( ").replace(/\)/g, " ) ").trim().split(/\s+/);
return source_code;
}
list.html 에서 아래와 같이 입력시에 ( + 1 2 3 )
아래와 같은 결과를 얻을 수 있다.
(,+,1,2,3,)
( ) 를 기준으로 파싱을 하기 위한 read_from_tokens() 함수를 만든다.
'(' 를 만나면, ')'를 만날 때 까지 값을 읽어서 그 값을 하나의 리스트에 저장한다.
')'를 만나면 리스트를 통째로 하나의 인자로 input 리스트에 인자로 넣는다.
function main(args) {
var Result = "";
//Tokenize
source_code = args.replace(/\(/g, " ( ").replace(/\)/g, " ) ").trim().split(/\s+/);
tokens = [];
read_from_tokens(source_code, tokens);
return tokens;
}
function read_from_tokens(input, output) {
token = input.shift();
switch(token) {
case undefined:
output.pop();
break;
case '(':
var list = [];
while (input[0] != ')') {
read_from_tokens(input, list);
}
input.shift(); // Remove ')'
output.push(list);
break;
case ')':
console.log("Error : Start with ')'!");
break;
default:
if ( isDigit(token.charAt(0))) {
output.push(parseInt(token));
} else {
output.push(token);
}
break;
}
}
function isDigit ( ch )
{
if ("0123456789".indexOf(ch) != -1)
return true;
return false;
}
list.html 에서 아래와 같이 입력시에
( + 1 2 3 )
아래와 같은 결과를 얻을 수 있다.
+,1,2,3
| Timer (0) | 2016.09.29 |
|---|---|
| Chobocho Calc 1 (1) | 2016.04.23 |
| 글자수 세는 자바 스크립트 (2) | 2011.11.15 |
def getDecimal(q, size):
if (q < 2):
return -1
p = 10
result = "0."
for i in range(size):
m = p % q
result += str(int(p / q))
if (m == 0):
break;
else:
p = m * 10
return result
for i in range(2, 10):
print(str(i) + " : " + getDecimal(i, 100) )2 : 0.5
3 : 0.3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
4 : 0.25
5 : 0.2
6 : 0.1666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666
7 : 0.1428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428
8 : 0.125
9 : 0.1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
| [Python] 진법 변환 (0) | 2016.12.27 |
|---|---|
| [Notepad++] Python 실행하기 (0) | 2016.08.28 |
| Cython 설치 (4) | 2013.12.15 |
[ python.bat ] C:\Users\sje\AppData\Local\Programs\Python\Python35-32\python.exe "%1" |
2. Notepad++ 실행 -> 실행
C:\Work\python.bat $(FULL_CURRENT_PATH)
| 단위분수를 소수로 변환하기 (0) | 2016.09.07 |
|---|---|
| Cython 설치 (4) | 2013.12.15 |
| 100000! ( 100000 팩토리얼 ) & 1000000! ( 1000000 팩토리얼 ) (0) | 2013.06.22 |