More Games - PAINONE

Android games

sites.google.com

flash/flex를 대신하여, 간단히 만들어본 차트

사용하려고 만든건 아니지만, 확실히 flash/flex를 사용하는게...
장점이라면 flash를 지원하지 않는 아이폰에서도 표현이 된다.

 

IE에 경우 excanvas라이브러리를 사용하면 되지만 fillText는 사용할 수 없다.
IE9에선 html5를 지원한다.

 


jQuery.fn.extend({
	BarChart : function(data) {
		var datas = data.data;
		var column = data.column;
		var lineCount = Math.ceil((data.count) ? data.count : 10) * 2;
		var BarMaxValue = function() {
			var value = 0;
			for(var i = 0; i < datas.length; i++) {
				for(var k in datas[i]) {
					if(k != column) {
						if(value < datas[i][k]) {
							value = datas[i][k];
						}
					}
				}
			}
			return value;
		}
		var BarMaxCount = function() {
			var value = 0;
			for(var k in datas[0]) {
				if(k != column) {
					value++;
				}
			}
			return value;
		}
		var barColors = ["#dede12", "#afafaf", "#ceaf72", "#ea9863", "#3b9696", "#93b336", "#88b0cf", "#b65c60", "#9479b1", "#d3ac32"];
		var barLineColor = ["#ffff00", "#cccccc", "#ffcc66", "#f3ab7d", "#51abab", "#a9c751", "#bed8ec", "#cc8285", "#b7a6ca", "#edc95a"];
		
		var canvas = document.createElement("canvas");
		jQuery(canvas).attr({
			width : this.width(),
			height : this.height()
		});
		/**
		*	브라우저가 getContext를 지원하는지 확인
		*/
		if(canvas.getContext) {
			var maxWidth = this.width() - 55;
			var maxHeight = this.height() - 55;
			var columnWidth = maxWidth / datas.length;
			var lineHeight = maxHeight / lineCount;
			var maxValue = BarMaxValue();
			var barWidth = (columnWidth - 16) / BarMaxCount();
			
			var context = canvas.getContext("2d");
			
			context.beginPath();
			context.lineWidth = 10;
			context.strokeStyle = "#bbccdd";
			context.moveTo(40, 10);
			context.lineTo(40, this.height() - 35);
			context.stroke();
			context.closePath();
			
			context.fillStyle = "#0b333c";
			context.font = "11px Dotum, Gulim, Arial, Verdana, sans-serif";

			var valueCount = maxValue / lineCount;
			for(var i = 0; i <= lineCount; i++) {
					var lineY = Math.ceil(lineHeight * i);
					if(i != lineCount) {
						context.beginPath();
						context.lineWidth = 2;
						context.strokeStyle = "#ffffff";
						context.moveTo(35, 15 + lineY);
						context.lineTo(45, 15 + lineY);
						context.stroke();
						context.closePath();
					}
					if(i%2 == 0) {
						if(i != lineCount) {
							context.beginPath();
							context.lineWidth = 2;
							context.strokeStyle = "#eeeeee";
							context.moveTo(45, 15 + lineY);
							context.lineTo(this.width() - 10, 15 + lineY);
							context.stroke();
							context.closePath();
						}
						context.textAlign = "right";
						context.fillText(Math.ceil(maxValue - (valueCount * i)), 30, 19 + lineY);
					}
			}

			context.beginPath();
			for(var i = 0; i < datas.length; i++) {
				context.lineWidth = 10;
				context.strokeStyle = "#bbccdd";
				if(i == 0) {
					context.moveTo(45 + (columnWidth * i), this.height() - 30);
				} else {
					context.moveTo(45 + (columnWidth * i) + 1, this.height() - 30);
				}
				if((i+1) == datas.length) {
					context.lineTo(45 + (columnWidth * (i+1)), this.height() - 30);
				} else {
					context.lineTo(45 + (columnWidth * (i+1)) - 1, this.height() - 30);
				}
				context.textAlign = "center";
				context.fillText(datas[i][column], (45 + (columnWidth * i)) + (columnWidth / 2), this.height() - 10, columnWidth-4);
			}
			context.stroke();
			context.closePath();
			
			for(var i = 0; i < datas.length; i++) {
				var n = 0;
				for(var k in datas[i]) {
					if(k != column) {
						if(datas[i][k]) {
							var percent = datas[i][k] / maxValue;
							var barHeight = maxHeight * percent;
							var barY = 15 + (maxHeight - barHeight);
							var barYY = (this.height() - 50) - (maxHeight - barHeight);
							
							context.shadowOffsetX = 0;
							context.shadowOffsetY = 0;
							context.shadowColor = "#7a7a7a";
							context.shadowBlur = 5;
							context.lineWidth = 2;
							context.fillStyle = barColors[n];
							context.fillRect(((47 + (columnWidth * i)) + 7) + (n * barWidth), barY, barWidth - 2, barYY);
							context.strokeStyle = barLineColor[n];
							context.strokeRect(((49 + (columnWidth * i)) + 7) + (n * barWidth), barY + 1, barWidth - 4, barYY - 2);
						}
						n++;
					}
				}
			}
			this.html(canvas);
		} else {
			// swf 등으로 대처
			this.html("IE9이상 또는 IE 외 브라우저를 이용하세요.");
		}
	}
});

jQuery(window).ready(function() {
	var chartData = [{"country":"가가가","a-1":501,"a-2":467},
					{"country":"나나나","b-1":512,"b-2":477},
					{"country":"다다다","c-1":0,"c-2":488},
					{"country":"라라라","d-1":10,"d-2":299},
					{"country":"마마마","e-1":1,"e-2":400},
					{"country":"바바바","f-1":712,"f-2":411}];
									
	var chartData1 = [{"country":"가가가","a-1":501},
					{"country":"나나나","b-1":512},
					{"country":"다다다","c-1":0},
					{"country":"라라라","d-1":10},
					{"country":"마마마","e-1":1},
					{"country":"바바바","f-1":712}];
									
	var chartData2 = [{"country":"가가가","a-1":501,"a-2":467,"a-3":123,"a-4":800},
					{"country":"나나나","b-1":512,"b-2":477,"b-3":321,"b-4":700},
					{"country":"다다다","c-1":0,"c-2":488,"c-3":234,"c-4":600},
					{"country":"라라라","d-1":10,"d-2":299,"d-3":432,"d-4":500}];
									
	var chartData3 = [{"country":"","a-1":501,"a-2":467,"a-3":123,"a-4":800,"a-5":501,"a-6":467,"a-7":123,"a-8":800,"a-9":555,"a-10":111}];
									
	jQuery("#chart1").BarChart({
		data : chartData2,
		column : "country",
		count : 10
	});
	
	jQuery("#chart2").BarChart({
		data : chartData,
		column : "country",
		count : 10
	});
	
	jQuery("#chart3").BarChart({
		data : chartData1,
		column : "country",
		count : 5
	});
	
	jQuery("#chart4").BarChart({
		data : chartData3,
		column : "country",
		count : 5
	});
});
/*
*	<span id="chart4" style="width:250px;height:200px;"></span>
*	<span id="chart3" style="width:300px;height:200px;"></span>
*	<div id="chart2" style="width:400px;height:300px;"></div>
*	<div id="chart1" style="width:500px;height:400px;"></div>
*/

 

 

 

안드로이드 게임들(Android games)

탱그램 XOR - Google Play 앱 탱그램 XOR은 XOR 로직을 기반으로하는 퍼즐 게임입니다. 각 스테이지마다 정해진 문제와 동일한 퍼즐을 완성해야합니다. play.google.com 벽돌깨기 - Google Play 앱 벽돌깨기 게임..

painone7.tistory.com

'Language > html5' 카테고리의 다른 글

Server-Sent Events  (0) 2010.08.04
Web Workers  (0) 2010.07.24
Web SQL Databas  (0) 2010.07.24
Web Storage (세션 스토리지)  (0) 2010.07.16
Web Storage (로컬 스토리지)  (0) 2010.07.16
 

More Games - PAINONE

Android games

sites.google.com

 

More Games - PAINONE

Android games

sites.google.com

jQuery ready

html DOM요소가 로딩이 완료되면 발생. 이미지가 로드되기 전에 실행
window["readyList"] = [];
Ready = function(func) {
	this.isReady = false;
	window["readyList"].push(func);
	
	var Func = function() {
		if(!this.isReady) {
			this.isReady = true;
			var fn, i = 0;
			while(fn = window["readyList"][i++]) {
				fn.call();
			}
			window["readyList"] = [];
		} else {
			if(!document.body) {
				return setTimeout(Func, 13);
			}
		}
	}
	
	var DOMContentLoaded = function() {
		if(document.addEventListener) {
			document.removeEventListener("DOMContentLoaded", DOMContentLoaded, false);
			Func();
		} else {
			if(document.readyState === "complete") {
				document.detachEvent("onreadystatechange", DOMContentLoaded);
				Func();
			}
		}
	}
	
	var ScrollCheck = function() {
		if(this.isReady) {
			return;
		}
	
		try {
			document.documentElement.doScroll("left");
		} catch (error) {
			setTimeout(ScrollCheck, 1);
			return;
		}
	
		Func();
	}
	
	if(document.readyState === "complete" ||  document.readyState === "loaded") {
		Func();
	}
	
	if(document.addEventListener) {
		document.addEventListener("DOMContentLoaded", DOMContentLoaded, false);
		window.addEventListener("load", Func, false);
	} else {
		document.attachEvent("onreadystatechange", DOMContentLoaded);
		window.attachEvent("onload", Func);
		
		var toplevel = false;
		try {
			toplevel = window.frameElement == null;
		} catch(e) {  }
	
		if(document.documentElement.doScroll && toplevel) {
			ScrollCheck();
		}
	}
}
사용법(jQuery 처럼 다중 사용 가능)
Ready(function() {
	// 실행 할 구문 작성
});
Ready(function() {
	// 실행 할 구문 작성
});
Ready(function() {
	// 실행 할 구문 작성
});

 

 

 

안드로이드 게임들(Android games)

탱그램 XOR - Google Play 앱 탱그램 XOR은 XOR 로직을 기반으로하는 퍼즐 게임입니다. 각 스테이지마다 정해진 문제와 동일한 퍼즐을 완성해야합니다. play.google.com 벽돌깨기 - Google Play 앱 벽돌깨기 게임..

painone7.tistory.com

 

More Games - PAINONE

Android games

sites.google.com

 

More Games - PAINONE

Android games

sites.google.com


◈◈◈◈◈◈◈◈◈◈◈◈ ftp관련 ◈◈◈◈◈◈◈◈◈◈◈◈
ftp접속 - ftp IPAddress입력
       user anonymous(익명사용자 접속시)
       password E-mail사용
ftp종료 - bye
get 파일명                         파일다운로드
put 파일명                         파일업로드
--------------------------------------
※ 여러개파일 업/다운로드시 mget, mput
--------------------------------------

◈◈◈◈◈◈◈◈◈◈◈◈ 기본명령어 ◈◈◈◈◈◈◈◈◈◈◈◈
ls                               현 드렉토리 파일목록보기
ls -a                               파일목록보기(숨김파일포함)
ls -l                               자세히보기
ls -al                               숨김파일포험 자세히보기
----------------------------------------------------------------------------------------
파일유형:파일허가권:링크수:파일소유자:파일소유그룹:파일크기:마지막변경날짜,시간:파일이름
※ 파일명 앞 . 숨김파일                                                 
※ 파일유형 d(디렉토리) -(파일)       
※ rwx rwx rwx / user group other / r읽기 w쓰기 x실행       
r=4 w=2 x=1 예 : --- 0 / --x 1 / -w- 2 / -wx 3 / r-- 4 / r-w 5 / rw- 6 / rwx 7      
----------------------------------------------------------------------------------------
chmod 허가권 파일명                  파일에 허가권변경(루트사용자 또는 허가권을 가진사용자만 가능)

cd                               현 사용자 홈드렉토리로 이동
cd root                               루트사용자 홈디렉토리 이동
cd ..                               상위디렉토리 이동
cd 경로지정                         지정경로 디렉토리 이동

pwd                               현 디렉토리 경로 보기

rm 파일명                         파일삭제
rm -r 디렉토리명                   디렉토리삭제
rm -f                               삭제시 물음없이 강제삭제
rmdir 디렉토리명                    디렉토리삭제(디렉토리안 비워있어야가능)
rm -rf 디렉토리명                    디렉토리삭제(안 내용까지 삭제)

cp 파일명 파일명             파일복사
cp -r 디렉토리명 디렉토리명             디렉토리복사
--------------------------------------------------------------------
※ 파일을 특정디렉토리에 복사할때 cp 파일명 디렉토리명(경로)      
다른 디렉토리안 파일을 복사할땐 cp 디렉토리경로/파일명 디렉토리명
--------------------------------------------------------------------

touch 파일명                         빈파일생성/있는파일일경우 수정시간변경

mv 파일명 디렉토리명                   파일을 지정디렉토리로 이동
mv 파일명 파일명                   이름변경
--------------------------------------------------------------------
※ 여러파일을 보내려할땐 mv 파일명 파일명 파일명 디렉토리명      
특정 디렉토리에 파일을 보내려할땐 mv 디렉토리명 파일명 디렉토리명
--------------------------------------------------------------------

mkdir 디렉토리명                    디렉토리생성
mkdir -p 디렉토리명/디렉토리명       디렉토리생성하고 그안에 디렉토리생성
------------------------------------------------------------------------------------------------
※ 디렉토리명 앞에 . 사용하면 숨김디렉토리                                    
디렉토리 생성시 처음 / 를 쓰고 디렉토리명을 입력하면 상위 드렉토리인 루트디렉토리에 생성된다.
cd로 특정디렉토리로 이동하거나, 디렉토리를 생성하거나 기타 등에 처음 / 를 입력하면       
상위디렉토리인 루트디렉토리를 지정하는 것으로 보면된다.                              
디렉토리명/디렉토리명 시엔 경로지정하는 것이라 보면 되지만, /디렉토리명 은 루트디렉토리부터
경로지정하는 것이다.                                                      
------------------------------------------------------------------------------------------------

cat 파일명 & 디렉토리/파일              텍스트파일 화면출력

more 파일명 & 디렉토리/파일              덱스트파일 페이지단위출력(스페이스바 다음페이지, b앞페이지)

----------------------------------------------------------------------------------------------------
파이프, 필터, 리다이렉션                                                      
| (\와 shift키 같이 사용)두 명령어를 연결하여 같이 사용                              
            예-ls -l /etc | more      ls -l /etc는 /etc디렉토리안 파일을 자세히보기            
             more 페이지단위로 화면에 출력 즉 ls -l /etc | more /etc디렉토리안 파일을 자세히보고
             페이지단위로 화면에 한페이지씩 출력하여 자세히 본다는 의미                  
                                                                        
grep, tail, wc, sort, awk, sed 등                                                
주로 | 와 같이 사용하고 필요한것만 걸러주는 명령어                                    
예-교제 376, 378페이지 VNC서버 설치할때 설치된 RPM확인할때 사용                        
                                                                        
표준입출력 방향을 바꿈                                                      
예-ls -l > aa,lst      ls -l결과를 aa.lst파일로 쓰도록한다. aa.lst파일이 존재할땐 덮어씀      
ls -l >> aa.lst      위와 같고 파일이 존재할때 덮어쓰지 않고 이어씀                        
등등                                                                   
(세가지다 그냥 넘어가려다 가끔 쓸일이 있을거 같아서 대충정리)                              
----------------------------------------------------------------------------------------------------

rdate -s time.bora.net                  정확한 현재시간을 가져와 시스템에 설정
                              (VMware에서 스냅샷을 하면 시간도 멈추기때문에 문제가 발생하기도 함)

◈◈◈◈◈◈◈◈◈◈◈◈ 기본명령어(사용자관련) ◈◈◈◈◈◈◈◈◈◈◈◈
adduser 사용자명                   사용자생성
adduser -d 디렉토리명 사용자명            지정한디렉토리에 사용자디렉토리생성
adduser -g 그룹명 사용자명            그룹지정하고 사용자생성       

----------------------------------------------------------------------------------------------
/etc/passwd (사용자정보파일)                                                      
사용자명:비밀번호:사용자 ID:사용자 소속 그룹 ID:전체이름:홈디렉토리:기본셸                  
/etc/shadow (사용자비밀번호파일)                                                
사용자명:비밀번호:최종수정일:변경최소일:변경최대일:만료경고기간:파기기간:계정만료기간:예약필드
/etc/group (그룹파일)                                                            
그룹명:비밀번호:그룸 ID:그룹에 속한 사용자                                          
/etc/skel (사용자생성시 유저 홈디렉토리에 복사되는 파일)                              
/bin/bash (사용자기본셸파일)                                                      
                                                                       
※ 사용자를 생성시 /etc/passwd, shadow 파일에 사용자를 추가                              
그룹을 지정하지 않고 생성시 /etc/group 파일에 그룹을 추가                              
디렉토리 지정하지 않고 생성시 홈디렉토리 /home/사용자명 생성                        
/etc/skel 파일을 사용자 홈 디렉토리에 복사                                          
(새로 생성할 사용자에게 배포할 파일이 있을결우 /etc/skel 파일안에 배포할 파일을 저장)      
----------------------------------------------------------------------------------------------
passwd 사용자명                    사용자비밀번호등록
-------------------------------------------------
passwd만 할경우 자신의 비밀번호변경              
passwd후 비밀번호 입력 / 비밀번호 확인 두번입력
-------------------------------------------------
whoami                              현재 접속중인 사용자보기
userdel      사용자명                  사용자삭제(홈디렉토리는 삭제안됨)
userdel -r 사용자명                   사용자의 홈디렉토리까지 삭제            
groupdel 그룹명                        그룹삭제
usermod -s /bin/false 사용자명            사용자로그인을 못하도록 설정
usermod -s /bin/bash 사용자명            사용자로그인을 다시할수 있도록 설정

su -                                root사용자 권한얻기

groupadd 그룹명                        그룹생성

◈◈◈◈◈◈◈◈◈◈◈◈ 기본명령어(시스템종료, 리부팅관련) ◈◈◈◈◈◈◈◈◈◈◈◈
shutdown -h now
halt
init 0                               시스템종료
----------------------------------------------------------------
shutdown -h 10m      10분후종료                        
shutdown -r 22:00      오후 10시 재가동                  
shutdown -c            shutdown 취소                        
shutdown -k now      접속된 사용자에게 종료메시지보내기      
----------------------------------------------------------------
----------------------------------
init                         
0      종료모드            
1      단일사용자모드(시스템복구시)
3      다중사용자모드(텍스트)      
5      다중사용자모드(X윈도우)
6      리부팅                  
----------------------------------
shutdown -r now
reboot
init 6                                시스템리부팅

logout
exit                               로그아웃(접속종료가 아닌 끝낸다는 의미)

◈◈◈◈◈◈◈◈◈◈◈◈ 링크관련(하트링크, 소프트링크) ◈◈◈◈◈◈◈◈◈◈◈◈
ln 링크할파일명 링크파일명            하드링크
ln -s 링크할파일명 링크파일명             소프트링크(심볼릭링크)
-------------------------------------------------------------------------------
하드링크=위치가 바뀌어도 원본파일과 연결가능(링크파일만 생성하고 같은 파일사용)
심볼릭링크=위치가 바뀌면 연결불가(원본파일과 연결만하는 파일생성)            
-------------------------------------------------------------------------------

◈◈◈◈◈◈◈◈◈◈◈◈ 파일압축관련 ◈◈◈◈◈◈◈◈◈◈◈◈
gzip 파일명                        확장자 *.gz로 압축
gzip -d 파일명                        확장자 *.gz파일에 압축을 풀어줌
gunzip 파일명                         확장자 *.gz파일에 압축을 풀어줌

bzip2 파일명                         확장자 *.bz2로 압축
bzip2 -d 파일명                   확장자 *.bz2파일에 압출을 풀어줌
bunzip2 파일명                        확장자 *.bz2파일에 압출을 풀어줌

tar 옵션(cvf) 지정파일명 파일명            옵션에 따라 파일 묶음
tar 옵션(xvf) 지정파일명            옵션에 따라 묶은 파일 풀어줌
-------------------------------------
c      파일을 새로 묶음      
x      묶은 파일을 풀어줌      
t      묶은 파일 풀기전 묶인경로보여줌
f      필수사항 파일명지정      
v      묶거나 풀리는 과정을 보여줌
z      *.tar.gz 파일을 품      
j      *.rar.bz2 파일을 품      
-------------------------------------

◈◈◈◈◈◈◈◈◈◈◈◈ X윈도우 설정명령어 & yum관련 ◈◈◈◈◈◈◈◈◈◈◈◈
system-config-display            디스플레이설정
system-config-date            날짜, 시간설정
system-config-keyboad            키보드설정
system-config-bind            네임서버설정
system-config-httpd            웹서버설정
system-config-language            언어설정
system-config-lvm            lvm설정
system-config-mouse            마우스설정
system-config-network            네트워크설정
system-config-nfs            nfs설정
system-config-packages            패키지추카설치
system-config-printer            프린터설정
system-config-rootpassword      root비밀번호관리
system-config-samba            samba서버설정
system-config-securiylevel      보안설정
system-config-soundcard            사운드설정
system-config-users            사용자관리

위 명령어가 실행되지 않을때
yum -y install system-config-XXX 명령어로 설치

yum install 패키지이름                  패키지설치 이미 있다면 업데이트 -y를 해주면 설치여부묻지않고 바로설치
yum check-update                  설치되어 있는 패키지중에 업데이트 가능한 패키지보여줌
yum update 패키지이름                  패키지업데이트(yum install으로 가능, yum update만 입력이 전부업데이트)
yum remove 패키지이름                  패키지삭제
yum info 패키지이름                  정보확인
--------------------------------------------------------------
yum은                                                
RPM의 의존성을 해결해주는 RPM툴이라고 보면된다.            
인터넷을 통하여 의존성을 가진 파일까지 전부 다운로드하여 설치.
/etc/yum.repos.d/ 디렉토리 안에 파일에 URL정보가 저장되어있다.
RPM(레드햇 패키지 매니져)                              
--------------------------------------------------------------
rpm -qa 패키지이름                  패키지가 설치되어있는지 확인

◈◈◈◈◈◈◈◈◈◈◈◈ cron & at ◈◈◈◈◈◈◈◈◈◈◈◈
cron                  반복된 작업을 하도록 설정하여 넣는 것
at                  일회용 한번만 하도록 설정
--------------------------------------------------------------
/etc/crontab      crond관련 파일                              
파일내용을 보면 각디렉토리별 시간별, 일별, 주별, 월별 디렉토리
01 * * * * root run-parts /etc/cron.hourly (시간별)            
02 4 * * * root run-parts /etc/cron.daily (일별)            
03 4 * * 0 root run-parts /etc/cron.weekly (주별)            
42 4 1 * * root run-parts /etc/cron.monthly (월별)            
분-시-일-월-요일-권한-실행명령                        
요일은 일요일~토요일 0~6 으로 지정                        
각디렉토리에 실행가능한 파일을 넣어놓으면 실행            
--------------------------------------------------------------
service crond status                  가동되어 있는지 확인

at 시간
at>실행명령어                        at실행 at>실행명령어입력이 끝나면 Ctrl+D키로 완료
at -l                              at실행 확인
atrm 작업번호                        at실행 취소
---------------------------------------------------------------
작업번호는 Ctrl+D키로 완료후 나오는 확인에 앞 job 번호      
또는 at -l 로 확인후 나오는 제일 앞에 나오는 번호를 입력하면 됨
---------------------------------------------------------------

◈◈◈◈◈◈◈◈◈◈◈◈ 네트워크설정관련 ◈◈◈◈◈◈◈◈◈◈◈◈
system-config-network                  X윈도우 네트워크설정
system-config-network-tui            텍스트기반
service network restart                  네트워크재시작
firefox                              웹브라이저 실행
ifconfig                        IP주소 확인
nslookup                        DNS서버의 작동을 테스트
ping                              네트워크 응답텍스트

네트워크 설정관련 파일
/etc/sysconfig/network (네트워크 기본정보)
/etc/sysconfig/network-scuipts/ifcfg-eth0 (eth0장치에 설정된 정보)
/etc/resolv.conf (DNS서버정보, 호스트이름)

vi /etc/sysconfig/network-scripts/ifcfg-eth0 실행하여
BOOTPROTO=dhcp       BOOTPROTO=에 dhcp로 바꾸면 dhcp로 설정

페도라서버B설치후(텍스트)
vi /etc/sysconfig/network-scripts/ifcfg-eth0 실행하면
BOOTPROTO=dhcp 부분이 나오지 않음. 아래부분삭제후
NETMASK = *** . *** . *** . ***
IPADDR = *** . *** . *** . ***
GATEWAY = *** . *** . *** . ***
BOOTPROTO=dhcp 를 추가해도 가능(직접해보니 되더만)

vi /etc/resolv.conf 실행후
nameserver 192.168.8.128 변경가능
텍스트모드실행후 DNS설정 위 방법으로가능

◈◈◈◈◈◈◈◈◈◈◈◈ vi에디터 기본사용법 ◈◈◈◈◈◈◈◈◈◈◈◈
a 또는 i                         입력모드(글을 입력하거나 수정할때..)
esc키                              명령모드
----------------------------------------------------------
명령모드 주요명령                              
yy                  현재 커서 줄 복사                  
dd                  현재 커서 줄 삭제            
숫자+yy            입력한 숫자만큼 줄복사            
숫자+dd            입력한 숫자만큼 줄삭제            
p                  복사한 내용 커서다음줄 붙여넣기      
P                  복사한 내용 커서위줄 붙여넣기      
/텍스트             현재 문서 내 입력한 텍스트 찾기
n                  찾은 텍스트와 같은 다음텍스트로 이동
:set number             현재 문서에 줄번호 표시            
----------------------------------------------------------

◈◈◈◈◈◈◈◈◈◈◈◈ 프로세스, 데몬, 서비스 ◈◈◈◈◈◈◈◈◈◈◈◈
--------------------------------------------------------------------------------------------
프로세스      -      하드에 저장되어있는 파일을 프로그램이라고 하면 그 파일을 실행한 상태를
                   프로세스라고 한다. (예-웹브라우저, 바이러스백신)            
포그라운드프로세스 - 실행하여 화면에 나타나는 프로그램(예-웹브라우저)            
백그라운드프로세스 - 실행하여도 화면에 나타나는 것이 아니라 뒤에서 실행하고 있는      
             프로그램(예-바이러스백신)                              
프로세스번호       -      실행하여 메모리에 로딩된 프로세스를 구분하기 위한 번호            
작업번호      -      실행되고 있는 백그라운드프로세스의 순차번호                   
                  부모, 자식 프로세스=프로세스안에 프로세스                  
                  (예-윈도우에서 웹브라우저을 실행하면 윈도우는 부모, 웹브라우저는 자식)
--------------------------------------------------------------------------------------------
ps -ef | grep 프로세스이름            프로세스번호 및 상태확인(ps 많은 옵션이 있지만 교제에서 주로사용할명령어)
kill -9 프로세스번호                  프로세스 강제종료
ctrl키+c                        프로세스 종료
ctrl키+z                        프로세스 일시정지
pstree                              부모프로세스와 자식프로세스의 관계를 트리형태로 보여줌
명령어 &                        포그라운드 프로세스를 백그라운드로 실행

----------------------------------------------------------------------------------------------
데몬-서버프로세스 백그라운드 프로세스의 일종.                                          
서버데몬은 standalone 타입과 xinetd 타입 데몬으로 나뉜다.                              
                                                                       
standalone 타입데몬은 독자적으로 구동되어 서비스하는 데몬을 말한다.                        
standalone 타입데몬이 실행스크립트파일은 "/etc/init.d/" 에 들어있다.                        
/etc/init.d/ 또는 system-config-services 명령으로 부팅시 자동실행여부를 지정할수 있다.            
예 - 웹서버(httpd), DB서버                                                      
실행명령 - service 서비스명 실행옵션                                                
실행옵션 - start, stop, restart                                                
                                                                       
xinetd 데몬은 standalone타입의 데몬으로 항상구동되어있지만 자신이 직접서비스를 하지않고      
자신에게 종속된 xinetd타임데몬을 불러 구동시킨다.                                    
xinetd 데몬이 서비스하는 포트는 "/etc/service" 파일에 설정되어있다.                        
                                                                       
xinetd 타입데몬은 가끔 사용되는 데몬을 말한다.                                    
항상구동시키는 것이 아닌 필요할때만 서비스를 불러 구동시키는 방식을 말한다.                  
xinetd 타입데몬의 설정파일은 "/etc/xinetd.d/" 에 들어있다.                              
예 - ftp서버(ftp서버를 항상구동시키려면 standalone타입데몬으로 설정)                        
실행명령 - service xinetd start                                                
----------------------------------------------------------------------------------------------

◈◈◈◈◈◈◈◈◈◈◈◈ 부트로더 ◈◈◈◈◈◈◈◈◈◈◈◈
GRUB 특징 - 부트정보를 수정, 변경하여 부팅할수 있다. 멀티부팅이 가능하다.
GRUB 설정파일 "/boot/grub/grub.conf" 링크파일 "/etc/grub.conf"
default=0
timeout=5      
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title Fedora Core (2.6.11-1.1369_FC4)
      root (hd0,0)
      kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/ rhgb quiet
      initrd /boot/initrd-2.6.1-1369_FC4.img

default=0
엔트리번호 부트엔트리는 title 로 시작 엔트리가 1개뿐이라 0번
멀티부팅으로 설치한 페도라에선 default=1로 되어있고, 윈도우 title 부팅엔트리도 Fedora 부팅엔트리 밑에 나와있다.
default=1 가만히 나두면 두번째 엔트리 즉 멀티부팅한 윈도우 엔트리로 부팅

timeout=5
초기부팅시 여유시간 5초를 의미 수정하여 여유시간을 늘리거나 줄일수도 있다.

splashimage=(hd0,0)/boot/grub/splash.xpm.gz
부팅이미지파일 지정한부분
(hd0,0) hd0 하드디스크를 의미(/dev/hda), 0 은 파티션을 의미(/dev/hda1)
역시 멀티부팅으로 설치한 페도라에선 (hd0.1) 로 나와있다. 한개 하드에 두번째 파티션을 의미


◈◈◈◈◈◈◈◈◈◈◈◈ RAID ◈◈◈◈◈◈◈◈◈◈◈◈
RAID0      여러개의 하드디스크에 동시에 저장하는 방식을 "스트라이핑(Stripping)"
      저장속도가 빠름, 데이타안정성이 떨어짐, 공간효율좋음
RAID1      같은 데이타를 두하드에 똑같이 저장하는 방식을 "미러링(Mirroring)"
      저장속도는 변화없고, 데이타안정성이 좋음, 공가효율떨어짐
RAID5      하드디스크에 요류발생시 "패리티(Parity)"를 이용해서 데이터를 복구
      하드디스크가 두개 고장시 복구안됨
RAID6      RAID5방식에서 "패리티"를 두개 이용하는 방식 하드디스크 두개고장시에도 복구가능
RAID0+1      RAID0(스트라이핑)과 RAID1(미러링)를 묶어서 사용하는 방식
      스트라이핑한 데이터를 미러링한다.
RAID10      RAID0+1과 반대로 미러링한 데이터를 스트라이핑하는 방식

◈◈◈◈◈◈◈◈◈◈◈◈ RAID0, RAID1, RAID5, RAID6 설치 ◈◈◈◈◈◈◈◈◈◈◈◈
RAID를 구성하기 위해선 "mdadm" 패키지를 설치해야한다.
설치또는 업그레이드 "yum -y install mdadm" 으로 설치

RAID0, RAID1, RAID5, RAID6 설치
fdisk 장치 파티션을 나눌때 파일시스템유형을
Command : t
Hex Code : fd 로 한다.

"mknod /dev/md0 d 9 0"
/dev/md0 에 이름을 따로지정하여 사용 d(Block Device) 9(장치주번호) 0(0번째 장치를 의미)

mdadm 을 사용하여 mknod에서 생성한 장치(/dev/md0) /dev/sda1, /dev/sdb1 을 장치(/dev/md0)안에 생성한다.
"mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sda1 /dev/sdb1"
--level=0 RAID0 을 만든다는 의미이다. 1번 으로 하면 RAID1 5번으로 하면 RAID5 를 만든다는 의미이다.
--raid-devices=2 하드디스크(드라이브) 2개를 /dev/md0 에 생성한다는 의미이다.

mkfs.ext3 /dev/md0 → mkdir 디렉토리명 → mount /dev/md0 생성한디렉토리 → /etc/fstab등록
/dev/md0      마운트한디렉토리      ext3      defaults      1 1

RAID0, RAID1, RAID5, RAID6 위와 같은 방식에서
"mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sda1 /dev/sdb1" 를 설정하면 된다.

◈◈◈◈◈◈◈◈◈◈◈◈ RAID0+1, RAID10 설치 ◈◈◈◈◈◈◈◈◈◈◈◈
RAID0+1 설치
"mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sda1 /dev/sdb1"
"mdadm --create /dev/md1 --level=0 --raid-devices=2 /dev/sdc1 /dev/sdd1"
전부분을 생략 하고 위처럼까지만 /dev/md0, /dev/md1 를 level=0으로 두장치를 RAID0으로 생성한다.

"mknod /dev/md2 b 9 2" /dev/md2장치를 생성한다. 마찬가지로 /dev/지정하여 생성
생성한 RAID0(/dev/md0), RAID1(/dev/md1) 를 /dev/md2 안에생성한다.
"mdadm --create /dev/md2 --level=1 --raid-devices=2 /dev/md0 /dev/md1"

mkfs.ext3 /dev/md2 → mkdir 디렉토리명 → mount /dev/md2 생성한디렉토리 → /etc/fstab등록


RAID10 설치
RAID10 mdadm의 버전이 1.7 이상이여야 한다.
하드(/dev/sda, /dev/sdb, /dev/sdc, /dev/sdd)를 fdisk 한다.
/dev/sda1, /dev/sdb1, /dev/sdc1, /dev/sdd1

"mknod /dev/md10 b 9 10" /dev/md10장치를 생성한다.
"mdadm --create /dev/md10 --level=10 --raid-devices=4 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1"
4장치를 /dev/md10 장치안에 생성한다.

mkfs.ext3 /dev/md10 → mkdir 디렉토리명 → mount /dev/md2 생성한디렉토리 → /etc/fstab등록

◈◈◈◈◈◈◈◈◈◈◈◈ RAID 하드고장시 교체 ◈◈◈◈◈◈◈◈◈◈◈◈
고장난 하드를 제거 새로운 하드로 장착한다.
fdisk한다.
"mdadm /dev/장치 --add /dev/sd??" 명령어로 새 하드를 교체
---------------------------------------------------------
mdadm --stop /dev/md0            RAID 장치인 /dev/md0를 중지
mdadm --detail --scan            현재 RAID 장치 목록을 본다.
---------------------------------------------------------

◈◈◈◈◈◈◈◈◈◈◈◈ 쿼터(Quota) ◈◈◈◈◈◈◈◈◈◈◈◈
쿼터 -      파일시스템마다 사용자나 그룹이 생성할수 있는 파일의 용량 및 개수를 제한
      별도의 파일시스템을 지정하여 / 파일시스템을 사용하지 못하게 하여,
      시스템문제 발생이 없도록 한다.
      여러 사용자가 동시에 / 파일시스템을 사용하여 성능이 저하되는 일을 없도록한다.

/etc/fstab 를 열어 생성한 RAID 또는 LVM 둘다 없으면 사용자 홈디렉토리 /home/사용자명
마운트하고 defaults 뒤에 defaults,usrquota 를 추가한다.
예 -      /dev/hda1      /home/pain      ext3      defaults,usrquota 1 1
      /dev/md10      /raid10data      ext3      defaults,usrquota 1 1
/home/pain 예로 pain 라는 사용자 홈디렉토리
/dev/md10      /raid10data 예로 RAID10 장치(/dev/md10) /raid10data마운한 디렉토리

"mount -o remount /home/pain"             다시 마운트하고나 또는 재부팅
"mount"                              쿼터용으로 마운트되었는지 확인한다.
확인하면 아래와 같이 쿼터용으로 마운트된것이 확인된다.
/dev/hda1 on /home/pain type ext3 (rw,usrquota)

쿼터 DB생성
cd /home/pain                        쿼터용 파일시스템이 마운트된 디렉토리로 이동
touch quota.user                  quota.user이라는 빈파일 생성
chmod 600 quota.user                  보안을 위해 소유자(root) 외 접근못하도록 설정
quotacheck -a -m
convertquota /home/pain      

edquota -u pain                        사용자 할당량을 편집 그룹으로 할경우 edquota -g 그룹명 으로 하면된다.
-------------------------------------------------------------------------------------------------------
Filesystem      blocks      soft      hard      inodes      soft      hard                                    
/dev/hda1       24       0       0       6       0       0                                    
                                                                              
Filesystem - 쿼터를 활당한 파일시스템                                                      
blocks, soft, hard - blocks용량을 의미사용자가 사용하는 블록 소프트한도 하드한도를 의미            
             blocks 24 사용자가 현재 24KB를 사용 soft, hard 0 사용한도를 제한하지 않아 0을 의미
inodes, soft, hard - inodes 파일의 개수를 의미 현재 6개를 사용하고 있고 제한은 없다.                  
                                                                              
편집하는 법은 vi 사용법과 같다.                                                      
soft한도를 초과하면 사용자에게 경고 메시지보냄                                          
hard는 최대한도 초과할수 없다.                                                      
-------------------------------------------------------------------------------------------------------
repquota /home/pain                  사용자별로 현재사용량 확인
edquota -t                        soft한도를 초과한 사용량에 대한 유예기간 변경
edpuota -p 기준사용자 적용할사용자      기준사용자와 같은 할당량 적용

'Language > Etc' 카테고리의 다른 글

[Apache] httpd.conf 번역  (0) 2010.07.10
 

More Games - PAINONE

Android games

sites.google.com

 

More Games - PAINONE

Android games

sites.google.com

  1. php를 원하는 디렉토리에 압축해제 (예 - C:\php)
  2. php.ini-dist 파일을 php.ini 변경
  3. Windows 디렉토리에 php.ini 파일 복사
  4. 제어판 → Windows 기능 사용/사용 안함 → 인터넷 정보 서비스 확장 → 응용 프로그램 개발 기능 → ISAPI 필터 체크, ISAPI 확장 체크
  5. IIS 관리자 실행 후 처리기 매핑 클릭
  6. 스크립트 매핑추가 (요청경로에 *.php 실행파일에 C:\php\php5isapi.dll 이름에 PHP 입력후 확인)
  7. phpinfo() 작성후 페이지확인

'Language > php' 카테고리의 다른 글

Apache php mysql (window) 연동  (0) 2010.07.16
strtotime() 함수  (0) 2010.07.10
해당 년월에 총 일수 구하는 함수  (0) 2010.07.10
PHP XML파싱 예제!!  (0) 2010.07.10
php.ini 파일 번역 (출처 : apmsetup)  (0) 2010.07.10
 

More Games - PAINONE

Android games

sites.google.com

 

More Games - PAINONE

Android games

sites.google.com

onload, DOMContentLoaded, onreadystatechange, defer, jQuery ready 페이지 로드 테스트

  • onload - 개체 로딩이 다 되었을 때 발생한다.
  • DOMContentLoaded - html DOM요소가 로딩이 완료되면 발생. 이미지가 로드되기 전에 실행(IE에선 지원 안함)
  • onreadystatechange - 개체의 상태(state)가 변경되면 발생된다.(IE, Opera 지원 readyState는 모든 브라우저가 반환)
    • uninitialized - 개체가 데이터로 초기화되지 않았다.
    • loading - 개체에 데이터가 로딩되고 있다.
    • loaded - 개체에 데이터 로딩이 완료되었다.
    • interactive - 개체에 데이터가 완전히 로딩되지 않았어도 사용자가 개체에 작용할 수 있다.
    • complete - 개체의 초기화가 완료되었다.
  • defer - 웹 페이지의 파싱이 완료된 다음 스크립트를 실행한다.(IE전용 HTML5에선 async 속성과 같이 표준속성으로 추가??)
  • jQuery ready - html DOM요소가 로딩이 완료되면 발생. 이미지가 로드되기 전에 실행

 

이벤트 발생 순서 확인

 var time = (new Date()).getTime(); 
 
 
	if(document.addEventListener) {
		document.addEventListener( "DOMContentLoaded", function() {
			jQuery("#load").append("DOMContentLoaded "+ document.readyState +"<br/>");
			jQuery("#load").append("Time : "+ ((new Date()).getTime() - time) +"<br/>");
		}, false);
	} else {
		document.attachEvent("onreadystatechange", function() {
			if(!document.readyState || document.readyState === "complete" || document.readyState === "loaded") {
				jQuery("#load").append("onreadystatechange "+ document.readyState +"<br/>");
				jQuery("#load").append("Time : "+ ((new Date()).getTime() - time) +"<br/>");
			}
		});
	}
			
	window.onload = function() {
		jQuery("#load").append("onload "+ document.readyState +"<br/>");
		jQuery("#load").append("Time : "+ ((new Date()).getTime() - time) +"<br/>");
	}
			
	jQuery(window).ready(function() {
		jQuery("#load").append("jQuery ready "+ document.readyState +"<br/>");
		jQuery("#load").append("Time : "+ ((new Date()).getTime() - time) +"<br/>");
	});

	jQuery("#load").append("defer "+ document.readyState +"<br/>");
	jQuery("#load").append("Time : "+ ((new Date()).getTime() - time) +"<br/>");
  • IE 6,7,8
    • defer interactive
      Time : 34
    • jQuery ready interactive
      Time : 45
    • onreadystatechange complete
      Time : 48
    • onload complete
      Time : 57
  • chrome 6.0.472.63
    • defer loading
      Time : 23
    • jQuery ready loaded
      Time : 24
    • DOMContentLoaded loaded
      Time : 25
    • onload complete
      Time : 25
  • firefox 3.6.9
    • jQuery ready interactive
      Time : 76
    • DOMContentLoaded interactive
      Time : 76
    • onload complete
      Time : 81
  • opera 10.62
    • defer loading
      Time : 71
    • jQuery ready complete
      Time : 73
    • DOMContentLoaded complete
      Time : 73
    • onload complete
      Time : 74
  • safari 5.0.2
    • defer loading
      Time : 47
    • jQuery ready loaded
      Time : 49
    • DOMContentLoaded loaded
      Time : 51
    • onload complete
      Time : 52

 

페이지에 이미지(700x500)가 있을 시 이벤트 결과

 var time = (new Date()).getTime(); 
 
 
	if(document.addEventListener) {
		document.addEventListener( "DOMContentLoaded", function() {
			jQuery("#load").append("DOMContentLoaded "+ document.readyState +"<br/>");
			jQuery("#load").append("Time : "+ ((new Date()).getTime() - time) +" Image Widht : "+ jQuery("img").width() +"<br/>");
		}, false);
	} else {
		document.attachEvent("onreadystatechange", function() {
			if(!document.readyState || document.readyState === "complete" || document.readyState === "loaded") {
				jQuery("#load").append("onreadystatechange "+ document.readyState +"<br/>");
				jQuery("#load").append("Time : "+ ((new Date()).getTime() - time) +" Image Widht : "+ jQuery("img").width() +"<br/>");
			}
		});
	}
			
	window.onload = function() {
		jQuery("#load").append("onload "+ document.readyState +"<br/>");
		jQuery("#load").append("Time : "+ ((new Date()).getTime() - time) +" Image Widht : "+ jQuery("img").width() +"<br/>");
	}
			
	jQuery(window).ready(function() {
		jQuery("#load").append("jQuery ready "+ document.readyState +"<br/>");
		jQuery("#load").append("Time : "+ ((new Date()).getTime() - time) +" Image Widht : "+ jQuery("img").width() +"<br/>");
	});

	jQuery("#load").append("defer "+ document.readyState +"<br/>");
	jQuery("#load").append("Time : "+ ((new Date()).getTime() - time) +" Image Widht : "+ jQuery("img").width() +"<br/>");
  • IE 6,7,8
    • defer interactive
      Time : 40 Image Widht : 28
    • jQuery ready interactive
      Time : 51 Image Widht : 28
    • onreadystatechange complete
      Time : 2665 Image Widht : 700
    • onload complete
      Time : 2676 Image Widht : 700
  • chrome 6.0.472.63
    • defer loading
      Time : 67 Image Widht : 0
    • jQuery ready loaded
      Time : 70 Image Widht : 0
    • DOMContentLoaded loaded
      Time : 72 Image Widht : 0
    • onload complete
      Time : 2860 Image Widht : 700
  • firefox 3.6.9
    • defer loading
      Time : 52 Image Widht : 24
    • jQuery ready interactive
      Time : 65 Image Widht : 24
    • DOMContentLoaded interactive
      Time : 68 Image Widht : 24
    • onload complete
      Time : 2370 Image Widht : 700
  • opera 10.62
    • defer loading
      Time : 118 Image Widht : 50
    • jQuery ready interactive
      Time : 144 Image Widht : 50
    • DOMContentLoaded interactive
      Time : 145 Image Widht : 50
    • onload complete
      Time : 2518 Image Widht : 700
  • safari 5.0.2
    • defer loading
      Time : 63 Image Widht : 0
    • jQuery ready loaded
      Time : 69 Image Widht : 0
    • DOMContentLoaded loaded
      Time : 71 Image Widht : 0
    • onload complete
      Time : 2592 Image Widht : 700

 

defer속성에 DOMContentLoaded, onreadystatechange 이벤트 적용

 var time = (new Date()).getTime(); 
 
 
	if(document.addEventListener) {
		document.addEventListener( "DOMContentLoaded", function() {
			jQuery("#load").append("DOMContentLoaded "+ document.readyState +"<br/>");
			jQuery("#load").append("Time : "+ ((new Date()).getTime() - time) +" Image Widht : "+ jQuery("img").width() +"<br/>");
		}, false);
	} else {
		document.attachEvent("onreadystatechange", function() {
			if(!document.readyState || document.readyState === "complete" || document.readyState === "loaded") {
				jQuery("#load").append("onreadystatechange "+ document.readyState +"<br/>");
				jQuery("#load").append("Time : "+ ((new Date()).getTime() - time) +" Image Widht : "+ jQuery("img").width() +"<br/>");
			}
		});
	}
			
	window.onload = function() {
		jQuery("#load").append("onload "+ document.readyState +"<br/>");
		jQuery("#load").append("Time : "+ ((new Date()).getTime() - time) +" Image Widht : "+ jQuery("img").width() +"<br/>");
	}
			
	jQuery(window).ready(function() {
		jQuery("#load").append("jQuery ready "+ document.readyState +"<br/>");
		jQuery("#load").append("Time : "+ ((new Date()).getTime() - time) +" Image Widht : "+ jQuery("img").width() +"<br/>");
	});

	if(document.addEventListener) {
		document.addEventListener( "DOMContentLoaded", function() {
			jQuery("#load").append("defer "+ document.readyState +"<br/>");
			jQuery("#load").append("Time : "+ ((new Date()).getTime() - time) +" Image Widht : "+ jQuery("img").width() +"<br/>");
		}, false);
	} else {
		document.attachEvent("onreadystatechange", function() {
			if(!document.readyState || document.readyState === "complete" || document.readyState === "loaded" || document.readyState === "interactive") {
				jQuery("#load").append("defer "+ document.readyState +"<br/>");
				jQuery("#load").append("Time : "+ ((new Date()).getTime() - time) +" Image Widht : "+ jQuery("img").width() +"<br/>");
			}
		});
	}
  • IE 6,7,8
    • jQuery ready interactive
      Time : 42 Image Widht : 28
    • defer complete
      Time : 2433 Image Widht : 700
    • onreadystatechange complete
      Time : 2435 Image Widht : 700
    • onload complete
      Time : 2447 Image Widht : 700
  • chrome 6.0.472.63
    • jQuery ready loaded
      Time : 24 Image Widht : 0
    • DOMContentLoaded loaded
      Time : 27 Image Widht : 0
    • defer loaded
      Time : 29 Image Widht : 0
    • onload complete
      Time : 2627 Image Widht : 700
  • firefox 3.6.9
    • jQuery ready interactive
      Time : 74 Image Widht : 24
    • DOMContentLoaded interactive
      Time : 77 Image Widht : 24
    • defer interactive
      Time : 80 Image Widht : 24
    • onload complete
      Time : 2544 Image Widht : 700
  • opera 10.62
    • jQuery ready interactive
      Time : 135 Image Widht : 50
    • DOMContentLoaded interactive
      Time : 136 Image Widht : 50
    • defer interactive
      Time : 138 Image Widht : 50
    • onload complete
      Time : 2707 Image Widht : 700
  • safari 5.0.2
    • jQuery ready loaded
      Time : 60 Image Widht : 0
    • DOMContentLoaded loaded
      Time : 65 Image Widht : 0
    • defer loaded
      Time : 67 Image Widht : 0
    • onload complete
      Time : 2660 Image Widht : 700

 

Time IE8

'Language > JavaScript' 카테고리의 다른 글

jQuery를 사용할 수 없을때 ready 만들기  (0) 2010.10.17
IE referer 확인 가능한 링크 걸기  (0) 2010.07.06
숫자에 콤마 찍기  (0) 2010.07.06
문자열 자르기  (0) 2010.07.06
객체에 좌표 구하기  (0) 2010.07.06
 

More Games - PAINONE

Android games

sites.google.com

+ Recent posts