'전체 글'에 해당되는 글 396건
- 2020.10.28 M/M (Man Month) 이란?
- 2020.10.28 끄적3
- 2020.10.23 인터넷
- 2020.10.21 Why is ORDER BY in a FROM Subquery Ignored?
- 2020.10.15 끄적2
- 2020.08.25 favicon.ico 404 Not found 에러
- 2020.08.21 MYSQL INSERT UPDATE (ON DUPLICATE KEY)
- 2020.07.31 Map vs. Array
- 2020.07.15 6일차 JavaScript
- 2020.06.29 Maven Project War파일 만들기 ~ 개발서버 배포
소프트웨어개발 사업의 대가를 계산하는 방식의 하나로 한 사람이 한 달 동안 할 수 있는 양을 계산해 사업비를 책정한다. 즉 사업에 투입한 인력 수를 기준으로 사업비를 책정하는 방식인 셈이다.
인력을 기준으로 사업비를 책정하기 때문에 발주자나 관리자 입장에서는 편리하다. 하지만 투입 인력의 수준에 관계없이 인력의 수에만 초점을 맞추다 보니 소프트웨어의 질을 확보하기가 쉽지 않다는 단점이 있다.
출처 : [네이버 지식백과] 맨먼스 [man/month] (한경 경제용어사전)
프로젝트 제안서를 작성할 때 투입 인원의 개념으로 '맨먼쓰'라는 표현을 많이 씁니다.
맨먼쓰를 이해하기 전에 [작업 시간]과 [단위]에 대해 알 필요가 있습니다.
[작업 시간]은 자원이 작업에 투입되는 예정 시간을 뜻합니다. 1일 4시간 일할 예정이면 작업 시간이 4시간이라는 뜻입니다.
달력에서 하루의 [사용 가능한 작업 시간] 대비 [작업 시간]을 [단위]라고 합니다.
예를 들면 하루의 단위가 50%라면 달력 상에서 하루에 8시간 근무하기로 되어 있는데 4시간 업무가 배정되었다는 뜻입니다.
맨먼쓰(M/M, Man Month)는 엄밀히 men per month의 뜻입니다.
프로젝트에 투입되는 월 인원을 나타내는 숫자입니다. 프로젝트의 크기를 표현할때 주로 쓰입니다.
1 M/M 이면,
1명이 한달간 하면 끝낼수 있다,
2명이면 보름이면 끝낸다는 뜻입니다.
5 M/M 이면,
1명을 투입하면 5달 걸린다,
5명을 투입하면 한달걸린다는 뜻입니다.
각 사람의 능력은 동일하다는 전제하에 나오는 숫자입니다.
M/M는 투입되는 작업 시간의 양(How big)과 관련된 사항이며 [기간](How long)과는 다른 의미인 점을 이해할 필요가 있습니다.
출처: https://oracle.tistory.com/373 [안나푸르나]
'etc' 카테고리의 다른 글
About 코딩 학습 방식 (0) | 2020.10.29 |
---|---|
2020년 어떤 프로그래밍 언어를 배워야 할까? (0) | 2020.10.29 |
끄적3 (0) | 2020.10.28 |
끄적2 (0) | 2020.10.15 |
고쳐야할것, 실수 끄적여놓은 것들 (0) | 2020.06.23 |
3년 ~ 5년 후의 model을 생각해보고,
그에 맞는 스케줄링을 해보자...
'etc' 카테고리의 다른 글
2020년 어떤 프로그래밍 언어를 배워야 할까? (0) | 2020.10.29 |
---|---|
M/M (Man Month) 이란? (0) | 2020.10.28 |
끄적2 (0) | 2020.10.15 |
고쳐야할것, 실수 끄적여놓은 것들 (0) | 2020.06.23 |
경로 표기법 (0) | 2020.04.17 |
<IP와 도메인>
- 우리가 알고있는 홈페이지 주소들은 결국 IP주소로 변환이 되어야 함. 이를 가능케 해주는 것이 DNS임
<IPv6>
- 기존 IP(IPv4)는 0.0.0.0.~255.255.255.255. 총 42억개만 사용가능. 이미 수요 초과임.
- 이를 해결하기 위해 등장한 방법들(1/2/3)
1. IPv6 : 훨씬 복잡함. 2^128까지 IP주소 생성 가능. 단 기존 IPv4가 적용된 것들은 적용이 어려움... 현재 동시 사용 중
<포트>
2. 사설IP/공인IP : 공인IP의 가격문제로, 공유기를 통해 여러대의 기기 연결이 가능함. 이 때 개별 기기는 사설IP를 가지게 되는데, 이는 공인IP 내에서만 유효함. 이 사설IP를 가진 기기에 외부연결을 위한 기능이 포트포워딩임.
- 포트는 서버의 문이라고 이해하면 됨. 각 포트안에 웹서버가 설치되어 있음. 'IP주소:nn' 입력 시, 'nn'포트에 접속하는 것임
<포트포워딩>
- 공유기는 공인IP를 받음(WAN 꽂는 자리). 나머지 LANx는 사설IP를 가지고 있음.
- 사설IP를 외부로 연결시키기 위해 포트포워딩을 통해 공인IP 접속하면 특정 사설IP로 연결하도록 설정할 수 있음.
<절대경로, 상대경로>
- 절대경로: '/'만 쓰면 최상위 경로를 의미함(절대경로지만, IP가 바뀐다면 상대경로?!)
- 상대경로: '..'/'.' 을 통해, 부모/현재 디렉토리 기준으로 상대경로 설정 가능
- 기본(대문)페이지: 기본IP 주소만 입력하면 IP주소/index.html이 기본으로 열림. index.php를 열게 하기위해서는 index.html을 삭제하면 됨
<유동IP와 DDNS>
3. 통신사가 제공하는 IP는 계속 바뀜. Dynamic Address. 통신사가 한정적으로 IP를 가지고 있기 때문에, 사용하지 않을 때 회수했다가 새로 부여하는 방식임.
- 이를 해결하기 위한 DDNS(Dynamic DNS): 사용자는 도메인네임으로 접속할 뿐 IP는 모름. DDNS는 도메인과 호스트 IP를 동기화해주는 기능을 제공.
MySQL의 서브 쿼리에서의 order by는 경우에 따라 무의미하다.
MySQL은 서브쿼리의 결과 순서를 따로 메모리에 적재해 놓지 않기에 서브쿼리의 order가 메인쿼리에서는 무시됨.
따라서,
SELECT @rownum:=@rownum+1 as num, x.*
FROM (SELECT col1, col2
FROM TABLE1
ORDER BY col2
LIMIT 18446744073709551615
) X,
(SELECT @rownum:=0) r
위와 같이
서브쿼리에 LIMIT를 정해 주는 것으로 원하는 결과를 얻을 수 있다고 한다.
출처: https://amnesis.tistory.com/17 [달바라기]
출처: https://mariadb.com/kb/en/why-is-order-by-in-a-from-subquery-ignored/
'DATABASE(SQL)' 카테고리의 다른 글
Dual 테이블이란? (0) | 2021.04.19 |
---|---|
프로시저, 트랜잭션, 배치 (0) | 2021.04.16 |
MYSQL INSERT UPDATE (ON DUPLICATE KEY) (0) | 2020.08.21 |
mysql - 프로시저 (0) | 2020.06.24 |
전자정부 프레임워크에 트랜잭션 적용하기 (2) | 2020.03.31 |
주니어 때 놓칠 수 있는 것 중 하나는 ‘큰 그림’을 보는 것이다.
사실 처음 주어지는 업무는 이미 만들어진 시스템의 일부를 유지보수 하거나 기능을 추가하는 업무이다.
그렇기 때문에 큰 그림을 놓칠 수가 있는데,
더 발전하는 개발자가 되기 위해서는 ‘큰 그림’을 보며 작은 것을 바꾸더라도 ‘큰 그림’에 어울리게 바꾸어야 한다.
그래야만 더 좋은 ‘큰 그림’을 그릴 수 있다.
'etc' 카테고리의 다른 글
M/M (Man Month) 이란? (0) | 2020.10.28 |
---|---|
끄적3 (0) | 2020.10.28 |
고쳐야할것, 실수 끄적여놓은 것들 (0) | 2020.06.23 |
경로 표기법 (0) | 2020.04.17 |
트러블 슈팅이란? (0) | 2020.04.07 |
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
해당 jsp에 삽입하면 해결됨
favicon.ico 는 브라우저 아이콘을 가리킴.
출처 : https://stackoverflow.com/questions/31075893/im-getting-favicon-ico-error
'JavaScript' 카테고리의 다른 글
Coding Convention (0) | 2021.04.02 |
---|---|
성능 향상을 위한 자바스크립트 코딩 패턴 (0) | 2020.10.29 |
Map vs. Array (0) | 2020.07.31 |
formData, XMLHttpRequset, HTTP Content-Disposition (0) | 2020.06.01 |
일반for문 vs. for in문 (0) | 2020.05.28 |
1. 조건 : unique key
UNIQUE KEY `명칭` (`field1`,`field2`) 로 create table
field1, field2 는 unique key로 묶고자 하는 컬럼
2. 쿼리
INSERT INTO SSP_ATD
(
field1
...
)
VALUES
(
#{value1}
...
)
ON DUPLICATE KEY UPDATE
field1 = #{value1}
...
;
3. unique key가 겹칠경우 아래의 update 구문을 수행함!
'DATABASE(SQL)' 카테고리의 다른 글
프로시저, 트랜잭션, 배치 (0) | 2021.04.16 |
---|---|
Why is ORDER BY in a FROM Subquery Ignored? (0) | 2020.10.21 |
mysql - 프로시저 (0) | 2020.06.24 |
전자정부 프레임워크에 트랜잭션 적용하기 (2) | 2020.03.31 |
데이터베이스에서 null 과 빈 문자열(empty string)의 차이점 (0) | 2020.03.23 |
Map : object 형식으로 바로 index 찾을 수 있음... -> deep copy 활용
Array : index를 알아야 찾을 수 있음.
'JavaScript' 카테고리의 다른 글
성능 향상을 위한 자바스크립트 코딩 패턴 (0) | 2020.10.29 |
---|---|
favicon.ico 404 Not found 에러 (0) | 2020.08.25 |
formData, XMLHttpRequset, HTTP Content-Disposition (0) | 2020.06.01 |
일반for문 vs. for in문 (0) | 2020.05.28 |
렉시컬 스코핑, 실행 컨텍스트와 클로저 (0) | 2020.05.06 |
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
/* 20.07.15 추가사항 */
==(동등연산자), !=(부등연산자) -> 자료형이 일치하지 않는 경우, 자료형을 일치시킨후 비교함.
===(일치연산자), !==(불일치연산자) -> 자료형변환없이, 엄격히 비교함.
so, ===(일치연산자), !==(불일치연산자) 을 사용하자!!!
/*비교연산자*/
/*0 ''(공백) false의 비교는 true(같다고 인식이 됨)*/
alert('' == false); // true
alert('' == 0); // true
alert(0 == false); // true
alert('273' == 273); // true , 비교시 숫자로 변환
alert(0 == null); // false
alert(0 == undefined); // false
alert(null == undefined); // true, 직접 비교시 결과다름.
/*일치연산자 : 자료형과 값 일치여부 -> 자료형과 값이 모두 일치*/
alert('' === false); // false
alert('' === 0); // false
alert(0 === false); // false
alert('273' === 273); // false
alert(null === undefined); // false
/*if조건문*/
var date = new Date();
var hour = date.getHours();
if(hour<11){
alert('아침 먹을 시간입니다.');
} else if(hour<15){
alert('점심 먹을 시간입니다.');
} else{
alert('저녁 먹을 시간입니다.');
}
/*switch 조건문*/
var input = Number(prompt('숫자를 입력하세요.', '숫자'));
switch(input % 2){
case 0:
alert('짝수입니다.');
break;
case 1:
alert('홀수입니다.');
break;
default:
alert('숫자가 아니올시다.');
break;
}
/* for반복문 */
var array = ['포도', '사과', '바나나', '망고'];
for(var i = array.length - 1; i>=0; i--){
alert(array[i]);
}
/* for in 반복문 */
var array = ['포도', '사과', '바나나', '망고'];
for(var i in array){
alert(array[i]);
}
/*while 반복문*/
var value = 0;
var startTime = new Date().getTime();
while(new Date().getTime() < startTime + 1000){
value++;
}
/*For문 예제 - label */
outerloop:
for(var i =0; i<10; i++){
innerloop:
for(var j = 0; j < 10; j++){
if(j > 3) break;
if(i == 2) break innerloop;
if(i == 4) break outerloop;
console.log("i=" + i + "j=" + j);
}
}
console.log("Final i = " + i + "j = " + j);
/* 배열의 내장함수 */
var array = ['포도', '사과', '바나나', '망고'];
/*forEach : 각각의 function 기능을 각각 실행 - for문대신 써도됨.*/
array.forEach(function(item){
console.log(item);
});
/*Symbol.iterator 속성을 가지는 컬렉션 전용*/
for(var i of array){
alert(i);
}
/*기존 기능에 영향을 주지 않으면서 새로운 property 추가*/
var mySymbol1 = Symbol('mySymbol');
var mySymbol2 = Symbol('mySymbol');
mySymbol1 === mySymbol2; //false
var prop2 = Symbol('prop2');
var obj = {
prop1: 1,
[prop2]: 2,
};
for(var key in obj){
console.log(key); // prop1만 출력됨
}
obj[prop2]; // 2, 대괄호[]로만 접근가능
/* 배열예제 1*/
var arrayA = [0,1,2,3];
arrayA.push(4); // 맨뒤에 추가
arrayA.pop(); // 맨뒤항목 제거 후 반환
arrayA.unshift(-1); // 맨앞에 추가
arrayA.shift(); // 맨앞에 항목제거 후 반환
delete arrayA[0]; // 첫번째 요소를 undefined로 변환 -> object에서는 속성제거
arrayA.splice(1,2); //인덱스 1위치에서 2개의 항목제거
arrayA.splice(1,2, 'four', 'five'); // 항목을 제거하고 2개의 항목을 인덱스 1에 추가
var arrayB = [4, 5, 6];
var arrayC = arrayA.concat(arrayB); // array 연결하기
var arrayD = arrayB.slice(1,2); // 원본은 유지하고 인덱스 1에서 2개의 항목으로 배열을 만들어 리턴
/* 배열예제 2*/
var numbers1 = ["apple", 1, 2, 3];
var numbers2 = numbers1.map(myFunction); // 함수로직을 반영한 새로운 배열을 리턴
var numbers3 = numbers1.filter(myFunction); // 함수가 true인 요소들의 새로운 배열을 리턴
var numbers4 = numbers1.every(myFunction); // 모든 요소가 함수의 조건을 만족하는지 check, some 존재
var a = numbers1.indexOf("apple"); // 0, lastIndexOf 존재
document.getElementById("demo").innerHTML = "Apple is found in a position" + a;
document.getElementById("demo").innerHTML = numbers2;
function myFunction(value, index, array){
return value *2;
}
document.getElementById("demo").innerHTML = numbers3;
function myFunction(value, index, array){
return value > 18;
}
document.getElementById("demo").innerHTML = numbers4;
function myFunction(value, index, array){
return value > 18;
}
/* 배열예제 3*/
var arrayA = ['b', 'c', 'a'];
arrayA.sort(); //정렬하기 - 함수넣을수 있음. comparable과 같다고 보면 됨.
arrayA.reverse(); // 역순으로 정렬하기
arrayA.sort(function(a,b){return a - b}); // 정렬기준 함수를 매개변수로 전달
var txt=""; // 전역변수
var numbers = [0, 1, 2];
numbers.forEach(myFunction); // 각요소별 함수호출
numbers.first(myFunction); // 함수조건을 만족하는 첫번째 요소값, findindex존재(index 리턴)
document.getElementById("demo").innerHTML = txt;
function myFunction(value, index, array){ // value(요소), array(전체배열)
txt = txt + value + "<br>";
}
//배열처럼 작동하는 유사배열을 내부적으로 많이 사용
var a = {};
// 1. 유사배열을 만들기 위해 property 추가
var i = 0;
while(i < 10){
a[i] = i * i;
i++;
}
a.length = i;
//2. 실제 배열인 것처럼 사용
var total = 0;
for(var j=0; j<a.length; j++)
total+= a[j];
// 메소드를 변수로 넘긴다!!!!!!!!
// 1. 배열a의 각 원소중 filter함수를 만족하는 요소만을 새로운 배열로 리턴
function filterArray(/*array*/a, /*Boolean function*/predicate){
var results = [];
var length = a.length; // 술어 함수가 배열의 길이를 반환할 경우에 대비하여
for(var i =0; i<length; i++){
var element = a[i];
if(predicate(element)) results.push(element);
}
return results;
}
// 2. 배열 a의 각 원소를 지정된 함수f로 전달하여 얻은 결과들을 원소로 하는 배열을 반환
function mapArray(/*array*/a, /*function*/f){
var r = [];
var length = a.length; //함수 f가 배열 길이를 변환할 경우에 대비하여
for(var i = 0; i < length; i++) r[i] = f(a[i]);
return r;
}
// 3. 피라미드 출력하기: alert or console.log 사용
function pyramid(){
var max = 10;
for(var i = 0; i <= max; i++) {
var print = "";
for(var j = max; j>i; j--) {
print+=" ";
}
for(var j = 0; j<2*i - 1; j++) {
print+="*";
}
console.log(print);
}
}
pyramid()
// 함수예제
// 함수를 전역변수에 할당
function square(x){return x*x;}
var a = square(4);
var b = square; // b는 함수를 가리킨다.
var c = b(5); // 자바스크립에서는 틀린 문법이 아님.
// 함수를 객체property에 할당
var o = new Object();
o.square = function(x){return x*x;}
var y = o.square(16);
// 배열원소에 함수 할당
var a = new Array(3);
a[0] = function(x){return x*x;}
a[1] = 20;
a[2] = a[0](a[1]);
// 객체의 property를 배열로 전달
function copyPropertyNamesToArray(o, a){
if(!a) a = []; // if구문이고 많이 쓰임. 요걸로 대체가능 ( a = a|| []; )
// !a는 !undefined 이므로 true임.
// ||연산자: 첫번째가 true거나 true로 반환되는 값이면
// 반환 아니면 두번째 반환
for(var property in o) a.push(property);
return a;
}
// 함수를 데이터로 사용하기(많이 쓰는 함수들이므로 알아두면 좋다....)
function add(x,y){return x+x;}
function subtract(x,y){return x-x;}
function muptiply(x,y){return x*x;}
function divide(x,y){return x/x;}
//위의 함수를 전달인자로 받아서 사용 -> 한줄로 끝낸다는 javascript의 장점 -> 많이쓰일수밖에 없다...
function operate(operator, operand1, operand2){
return operator(operand1, operand2);
}
// 객체로 구성하기
var i = operate(add, operate(add, 2, 3), operate(multiply, 4, 5));
var operations = {
add: function(x,y){return x+y;},
subtract: function(x,y){return x-y;},
muptiply: function(x,y){return x*y;},
divide: function(x,y){return x/y;},
pow: Math.pow // 이미 정의된 함수도 사용
}
function operate2(op_name, operand1, operand2){
if(typeof operators[op_name] == 'function'){
return operators[op_name](operand1, operand2);
} else throw 'unknown operator'; // 알수없는 연산자
}
var j = operate2('add', 'hello', operate2('add', '', 'world'));
var k = operate2('pow', 10, 2);
// 메소드로서의 함수
var calculator = {
operand1: 1;
operand2: 1;
// 함수는 this라 property를 통해 자신이 속한 객체에 접근할 수 있다.
compute:function(){
this.result = this.operand1 + this.operand2;
}
};
calculator.compute();
console.log(calculator.result); // 결과를 출력
// 함수 property: length => 정의된 함수 매개변수 갯수
function check(args){
var actual = args.length; // 실제로 전달받은 매개변수 갯수
var expected = args.callee.length; // 함수가 기대하는 매개변수 갯수
// arguments.callee 는 함수 자기자신을 가리킴(문법)
if(actual != expected){
throw new Error('Wrong number of arguments');
}
}
function f(x,y,z){
//함수가 기대하는 전달인자를 받았는지 검사
check(arguments);
return x+y+z;
}
// 함수 property 추가하기
//함수의 정적property를 생성하고 초기화
uniqueInteger.counter = 0;
//호출할때 마다 다른 값을 리턴
function uniqueInteger(){
return uniqueInteger.counter++;
}
// 객체 property를 전달인자로 사용하기(개발방식 중 하나)
function arraycopy(from, from_start, to, to_start, length)
function easycopy(args){
arraycopy(args.from, args.from_start || 0, args.to, args.to_start || 0, args.length);
}
</script>
</head>
<body>
<p id="demo"></p>
<button type="button" onclick="document.getElementById('demo').innerHTML=over18">Click !</button>
</body>
</html>
/*For문 예제 - label */
'Bitcamp > BITCAMP - Front Web' 카테고리의 다른 글
IBSheet 그리드 특강 (0) | 2019.09.26 |
---|---|
미니 프로젝트 (0) | 2019.09.17 |
12일차 jQuery (0) | 2019.09.16 |
11일차 jQuery (0) | 2019.09.11 |
JavaScript - LinkedList, nodeType(재귀), Event 핸들러, DOM (0) | 2019.09.10 |
* 20/06/29 추가
export - war file로 하면 제대로 배포가 안되는듯하고,
run - run configurations로 들어가야함.
1. Goals 부분에 clean package 입력
2. apply 누르고 run 누르면 해당 프로젝트 target 폴더에 .war 파일 생성됨
3. .war 파일 C:\tomcat9\webapps 에 넣은후, tomcat 실행(이클립스 서버 끈 상태에서)
4. http://localhost:8090/mavenTest/index.jsp 접속