소프트웨어 기술자 신고



소프트웨어 기술자로서 국가에 공식적으로 등록하려면
경력을 공식적으로 인정 받기 위해선

근무경력확인서-KOSA서식
기술경력확인서-KOSA서식

소프트웨어 기술자 본인이 다녔던 회사 마다
이렇게 두가지를 떼다가 제출해야 합니다.
이 두가지 서식에는 이전(현재) 업체의 직인이 반드시!!!! 필요합니다.
여기서 부터가 문제의 발단이며,,, 문제점을 차근히 살펴보자면....



1. 위의 두가지 KOSA서식에 이전+현재 업체의 직인을 모두 다 받았다고 끝이 아니죠 ㅋㅋ
기존 근무 업체 + 현재 일하는 업체가 SW사업자라고 KOSA에 반드시 신고가 되어
있어야 합니다. 신고가 안되어 있는 경우는 [소프트웨어기술업무 전담부서 확인서-KOSA서식]을
제출해야 합니다. 회사가 SW사업자로 KOSA에 신고가 안되어 있고, 소프트웨어전담 부서 없이 그냥
전산개발 + 유지보수 하는(했던) 사람은 경력인정이 힘들 것 같습니다.


2. 기존 근무 업체와 껄끄러운 관계가 있는 분은 경력인정이 많이 힘들 것 같네요.
기존 근무 업체(반드시 KOSA에 SW사업자 신고 등록완료)에서 위에 두가지 서식을
작성하여 반드시 기존업체의 직인을 찍어와야 합니다.
또 한 기존 근무 업체가 KOSA에 SW사업자 등록 안 되어 있으면,
다시 위의 1번과정을 반드시 거쳐야 합니다.


3. 기존에 일하던 업체가 폐업한 경우는 위에 저 두가지 서식에 폐업한 회사 직인을받을 수 없겠죠?
그래서 해결책을 KOSA에서 제시해 놨습니다. 폐업 업체의 사장(세금 납부 명의자)을 찾아내서,
사장이랑 같이 세무서 가거나, 사장한테 위임장+인감증명+주민번호 받아서,
세무서에서 "폐업사실증명"을 발급(필수!!!!) 받은 뒤
"4대연금 중 1개 납부내역"을 함께 제출하면 그제서야 경력의 80%를 인정을 받습니다.


4. 어렵사리 위의 고개를 넘었다고 하더라도,,
정보처리기사가 없는 분들은 둠1,2,3, 퀘이크1,2,3 개발한 존 카맥 수준이라고 하더라도,
2009년 8월 1일 부터는 무조건 초급부터 시작해야 하고, 2009년 8월 1일 이후 정보처리기사를 취득했다고
하더라도,,, 취득 일자 이전의 경력은 50%밖에 인정이 안됩니다. ㅋㅋ
아,, 박사 학위자라고 해도 정보처리기사 없으면 2009년 8월1일 부터는 얄짤없이 초급입니다 ^^;


5. 프리랜서로 일한 경우 용역계약서가 있으면 그것만 제출하면 됩니다.
용역계약서가 없을 경우 업체가 폐업 안했으면 위에 2번으로가고,
업체가 폐업했으면 위에 3번으로가면됩니다.


6. 정부기관/공공기관 등에서 소속되어 일하는(일했던) 사람들은 경력의 80%만 인정합니다.
물론 정부기관/공공기관 이라고 하더라도 SW사업자라고 KOSA에 등록이 안되어 있다면
위에 1번으로 가야 합니다.


7. 예전에 다니던 업체가 폐업 한 것은 아닌데, 문을 닫고 사장은 잠수 탔다고요 ?
그래도 경력인정 받는 방법 있다고 하네요.  KOSA에서 방법을 다 제시 해 놨습니다.
사업자등록증사본+각서+4대보험중1개납부실적을 함께 내면 됩니다.
그럼 경력의 80% 인정해 줍니다. 네? 잠수탄 업체의 사업자등록증 사본을 어떻게 구하냐구요 ?
뭐 그럼 초급으로 산뜻하게 새출발~~ 하셔야겠죠? ㅋㅋㅋ
이렇게 가다간 앞으로는 어쩌면 사망신고도 본인이 직접해야 하는 시대가 올지도 모르겠네요.  ^^;;;


뭐 대략 눈에 보이는 문제점만 해도 이정도네요..
한마디로,,,,, 기존에 고급 이상의 개발자들을 다 초급으로 후려치려는 의도로 밖에 안 보입니다. -_-;;

결국 IT개발자들은 모두 다 이나라를 뜨라는 의미인가 봅니다.
호주 영주권 정보 까페 가입하시고 틈틈히 정보 캐치하시고
호주 영주권 꼭 받아 놓으세요.
호주 영주권 받고 5년내로 이민 결정하면 됩니다.

호주가 무슨 꿈의 땅 유토피아 천국이라는 얘기가 아니라,,,
일단 이땅을 뜨는 것은 대비는 하고 있어야 할 듯 합니다.





최종 두줄 요약본

1. SI 개발자라면 소프트웨어기술자 신고 등록을 2009년 7월 31일 까지 필히 반드시해야만 한다.
2. 시간 나는대로 틈틈히 호주 영주권을 취득하는데 노력을 게을리 하지 말자. (선택이 아니라 필수)

by 연중무휴 | 2009/06/16 04:44 | 내 안의 생활 | 트랙백

쓸만한 배열 스크립트

//
// Array library
// by 행복한고니 (20041012)
//
// 배열에 검색한 값이 있으면 인덱스 번호를 리턴, 없으면 -1을 리턴
Array.prototype.search = function(val) {
var len = this.length;

for (var i=0; i < len; i++) {
if (this[i] == val) return i;
}

return -1;
}
// search 메소드와 같으나 대소문자 구별안함
Array.prototype.isearch = function(val) {
var len = this.length;
if ((typeof val).toLowerCase() == 'string') val = val.toLowerCase();
for (var i=0; i < len; i++) {
if (typeof this[i] != typeof val) continue;
if ((typeof val).toLowerCase() == 'string' && val == this[i].toLowerCase()) return i;
else if (val == this[i]) return i;
}
return -1;
}
// 키 배열을 받아서 문자열 인덱스가 있는 객체를 반환한다.
// 만일 배열의 크기가 서로 맞지 않으면 빈 array가 반환된다.
// 리턴값은 object
Array.prototype.combine = function(keyArr) {
if (this.length != keyArr.length) return [];

var ret = {};
for (var i=0; i < this.length; i++) ret[keyArr[i]] = this[i];

return ret;
}
// 범위의 값을 포함하고 있는 배열 반환
Array.prototype.range = function(Low, High, Step) {
var ret = [];
var t1 = (typeof Low).toLowerCase();
var t2 = (typeof High).toLowerCase();

if (Step == undefined) Step = 1;
if (!((t1 == 'number' || t1 == 'string') && t1 == t2)) return ret;
if (t1 == 'string') { Low = Low.charCodeAt(0); High = High.charCodeAt(0); }
for (var i=Low; i <= High; i+=Step) ret[ret.length] = (t1=='string')?String.fromCharCode(i):i;
return ret;
}
// 배열의 각 요소에 같은 함수 적용
// 만약, funcName 이라는 함수가 있다고 하면, Array.walk(funcName)과 같이 사용한다.
// 함수의 첫번째 전달자에 값이, 두번째 전달자에 인덱스가 전달된다.
Array.prototype.walk = function(Func) {
var len = this.length;
for (var i=0; i<len; i++) {
this[i] = Func(this[i], i);
}
}
// 배열 정렬 순서를 거꾸로 한다.
// 사용자 함수를 지정하면 지정한 함수로 정렬한다.
Array.prototype.rsort = function(sortFunc) {
if (sortFunc == undefined) this.sort();
else this.sort(sortFunc);
return this.reverse();
}
// 배열내에 존재하는 숫자를 모두 더한다.
Array.prototype.sum = function() {
var ret = 0;
for (var i=0; i<this.length; i++) {
if((typeof this[i]).toLowerCase() == 'number') ret += this[i];
}
return ret;
}
// 현재 배열요소를 반환한다.
Array.prototype.current = function() {
if (this._index > this.length) this._index = this.length;
return this[this._index];
}
// 현재 배열요소의 이전요소로 포인터를 이동하고 이전요소를 반환한다.
Array.prototype.prev = function() {
if (--this._index < 0) this._index++;
return this[this._index];
}
// 현재 배열요소의 다음요소로 포인터를 이동하고 다음요소를 반환한다.
Array.prototype.next = function() {
if (++this._index >= this.length) this._index--;
return this[this._index];
}
// 배열의 처음 요소로 포인터를 이동하고 요소를 반환한다.
Array.prototype.first = function() {
this._index = 0;
return this[0];
}
// 배열의 마지막 요소로 포인터를 이동하고 요소를 반환한다.
Array.prototype.end = function() {
this._index = this.length - 1;
return this[this._index];
}
// 현재 키를 반환한다.
Array.prototype.key = function() {
if (this._index < 0) this._index = 0;
else if (this.length > 0 && this._index >= this.length) this._index = this.length - 1;
return this._index;
}
Array.prototype._index = 0;
출처 : http://www.jakartaproject.com/article/javascripttip/110845107057800 

by 핵잠수함 | 2008/12/22 05:27 | Javascript | 트랙백

엑셀처럼 TD 사이즈 조절하기!

phpschool의 kisses님의 글입니다
정말 쓸만한 Tip입니다
====================================================
사용법은 제목부분의 칸 사이에 마우스를 가까이 하면
커서 모양이 바뀝니다. 그때 드래그를 하면 마우스가 이동한
거리만큼 셀의 크기가 바뀝니다.
제목 부분의 클레스 이름은 반드시 적어 주셔야 합니다.
셀의 사이즈가 변함에 따라 input 박스도 달라집니다...
그러나 사이즈가 변하는 input 박스를 남발 하면 반응 속도가
느려집니다. 또한 input 박스의 사이즈는 td의 cellpadding 보다
작아야 합니다.

주석을 달아 놨으니 이해하시는데는 별 어려움이 없을거라 생각 됩니다.

테이블을 <div> 테그 안에 넣지 않으시려면 테이블 자체의
사이즈는 지정해 주시면 안됩니다. (td)만 지정하세요

말줄임표 효과는 전에 스쿨에서 본걸로 구현해 보았습니다.
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=euc-kr">
<style>
.ellipsis {font:9pt "굴림"; width:100%; overflow:hidden; text-overflow:ellipsis; text-align:left; }
.colresize {font:9pt "굴림"; cursor:""; }
.input_box {width:expression(this.parentNode.clientWidth-8); }
</style>
<SCRIPT LANGUAGE="JavaScript">
<!--
var mousedown = false; //마우스를 누른 상태
var td = ""; //사이즈 변경할 td
var td_width; //변경할 td의 width,
var x = 0; //마우스 드레그전 가로위치
function TCstartColResize(obj){
mousedown = true;
td = obj;
td_width = td.width;
x = event.clientX;
}
function TCColResize()
{
if (mousedown){
var distX = event.x - x; //이동한 간격
td.width = parseInt(td_width) + parseInt(distX);
}
}
function TCstopColResize(){
mousedown = false;
td = '';
}
function cell_left(obj){//마우스가 셀의 왼쪽인지 측정
if(event.offsetX < 5 && obj.cellIndex!=0)
return true;
else
return false;
}
function cell_right(obj){//마우스가 셀의 오른쪽인지 측정
if(event.offsetX > obj.width-4)
return true;
else
return false;
}
//리사이즈시작
document.onmousedown = function(){
try{
var now_mousedown = window.event.srcElement;
if(now_mousedown.className.toUpperCase()=="COLRESIZE"){
if( cell_left(now_mousedown) ){
now_mousedown = now_mousedown.parentNode.childNodes[now_mousedown.cellIndex-1];
}else if( !cell_right(now_mousedown) ){
return true;//오른쪽도 왼쪽도 아니면 사이즈 조절 안함
}
TCstartColResize(now_mousedown);
}
}catch(e){ return true; }
}
//리사이즈
document.onmousemove = function(){
try{
var now_mousemove = window.event.srcElement;
if(now_mousemove.className.toUpperCase()=="COLRESIZE" || td!=""){
//셀의 가장자리면 마우스 커서 변경
if( cell_left(now_mousemove) || cell_right(now_mousemove) ){
now_mousemove.style.cursor = "col-resize";
}else{
now_mousemove.style.cursor = "";
}
TCColResize(now_mousemove);
}else{
now_mousemove.style.cursor = "";
}
}catch(e){ return true; }
}
//리사이즈종료
document.onmouseup = function(){
try{
var now_mouseup = window.event.srcElement;
//if(now_mouseup.className=="colResize"){
TCstopColResize(now_mouseup);
//}
}catch(e){ return true; }
}
//리사이즈 도중 텍스트 선택 금지
document.onselectstart = function(){
try{
if(td != ""){
return false;
}
}catch(e){ return true; }
}
//-->
</SCRIPT>
</HEAD>
<BODY>
<div style="width:100%;height:100;overflow-x:auto;overflow-y:auto">
<table width="430" border="0" cellpadding="3" cellspacing="1" bgcolor="#B8B8B8" nowrap style='table-layout:fixed'>
<tr bgcolor="#A5D4D2" align="center" height="25">
<td width="35" class="colresize">선택</td>
<td width="35" class="colresize">순번</td>
<td width="70" class="colresize">품목명</td>
<td width="30" class="colresize">수량</td>
<td width="50" class="colresize">단위</td>
<td width="70" class="colresize">날짜</td>
<td width="70" class="colresize">장소</td>
<td width="70" class="colresize">비고</td>
</tr>
<tr bgcolor="#FFFFFF" height="27" align="center">
<td><Input type="radio" name="radio"></td>
<td>1</td>
<td><input type='text' class="input_box"></td>
<td><input type='text' class="input_box"></td>
<td><select class="input_box"><option>EA</option></select></td>
<td><input type='text' class="input_box"></td>
<td><input type='text' class="input_box"></td>
<td nowrap class="ellipsis">비고 비고 비고 비고 비고 비고 비고 비고 비고</td>
</tr>
</table>
</div>
</BODY>
</HTML>
 
출처 : http://www.jakartaproject.com/article/javascripttip/110820942607300 

by 핵잠수함 | 2008/12/22 05:24 | Javascript | 트랙백

자바스크립트 성능 최적화 팁

1. 변수는 로컬에 명시적으로 정의한다.
함수내에서 사용되는 지역 변수가 있다면 명시적으로 var 표시를 해주도록 합니다. 그렇지 않을 경우 브라우저는 상위 scope를 모두 뒤져서 상위에 해당 변수가 정의되어있는지 확인합니다.
2. 가능하다면 일단 캐싱한다.
DOM은 느리므로 가급적이면 DOM을 호출하는 횟수를 줄입니다. 반복적으로 document.body.all 등이 쓰여야 할 경우 document.body.all 를 다른 변수로 캐싱해둡니다. Array 등에서 array.length 같은 것을 반복문에서 사용해야 할 경우 var len = array.length 등과 같이 array.length 를 캐시해서 사용합니다. 함수 내에서 자주 사용되는 전역함수의 경우 지역 변수로 캐싱해서 사용하는 것이 좋습니다.
3. with 키워드의 사용은 피합니다.
JScript 에서의 with 키워드 사용은 scope를 하나 더 정의하는 것과 비슷한 비용이 듭니다.
4. 문자열을 많이 다루어야 할 경우에는 배열에 넣고 join 하는게 빠릅니다.
JavaScript에서는 자동으로 효율적인 코드로 변경하지만 JScript는 못합니다. 그래서 이런 식의 StringBuffer를 구현해줘야 빨라집니다.
5. eval은 무척이나 비용이 높은 명령입니다.
가급적이면 사용을 피하는게 좋습니다.
6. 가능하다면 closure를 피하세요.
closure는 매우 강력하기는 하지만 동시에 매우 위험하기도 합니다. 주의깊게 다루어야 할 뿐더러 최근에 패치가 되기 전까지 JScript는 DOM에 사용된 closure에 대해서 메모리 누수 현상이 있었습니다(패치 되지 않았거나 IE6 미만의 버전을 사용한다면 여전히 존재할 것입니다).
7. 프로퍼티 접근 함수는 사용하지 마세요.
객체지향 측면에서는 훌륭하지만 JScript로서는 끔찍합니다(헉… 이거 프레임웍에 썼는데…).

by 핵잠수함 | 2008/12/22 05:16 | Javascript | 트랙백

requeset.getParameterMap() 키값을 이용한 value값 추출

출처 창화's Room | 이창화
원문 http://blog.naver.com/golbangi2002/70037563665
request.getParameterMap()는 request 에 담긴 parameter만 빼내서 Map으로 저장해주는 메서드이다.
예제 :
public boolean checkXss(HttpServletRequest request) {
boolean flag = false;

Map paramMap = request.getParameterMap();
String paramName = "";
String str = "";
Enumeration enum = request.getParameterNames();

for(int i=0; i<paramMap.size(); i++) {
paramName = (String)enum.nextElement();
logger.debug("paramName ===== " + paramName);
//파라메터가 배열로 들어오는 경우 체크
for (int j=0; j < ((String[])paramMap.get(paramName)).length ;j++) {
str = ((String[])paramMap.get(paramName))[j];

logger.debug("map.get(str) ===== " + str);
if(str.indexOf("<") > 0 ||
str.indexOf(">") > 0 ||
str.indexOf("script") > 0) {
flag = true;
}
}
}
return flag;
}
출처 : 본인
아래는 참고로 적는다.
Map map = request.getParameterMap();
...
String value = (String)map.get(key);
java.lang.ClassCastException 발생
Returns:
an immutable java.util.Map containing parameter names as keys and parameter values as map values. The keys in the parameter map are of type String. The values in the parameter map are of type String array.
"
이렇게 하면 된다.
Map map= request.getParameterMap();
...
String value = ((String[])map.get(key))[0];

by 핵잠수함 | 2008/12/15 11:43 | JSP | 트랙백

<< 이전 페이지다음 페이지 >>