답글형 게시판 분석

답글형 게시판 분석

(2015/3/24 화요일 22:55)

 

우선 글의 종류를 구분해 두겠다.

 

1. 최고 조상글: 루트의 루트의… 의 루트. 최고 조상글을 말한다.

 

2. 루트: 답글달려고 했던 원글을 말한다.

 

3. 내 글: 내가 쓴 글이다. 내가 쓰는 답글, 내가 삭제하려는 답글을 뜻한다.

 

1. 새 글을 쓸 경우

구분 내 글 처리하는 법 기타
no

글쓸 때마다 자동증가 (MAX+1)

gi

no

gs(순서)

0

 

gt(탭)

0

root

0

depth

0

 

요약하면, n / n / 0 / 0 / 0 / 0 을 대입하면 된다.

 

2. 답글을 쓸 경우

구분 내 글 처리하는 법 기타
no

글쓸 때마다 자동증가 (MAX+1)

gi

최고조상의 no

gs(순서)

루트gs+1

이어서,

gi가 내 글의 gi와 같고,(=같은 그룹이고)

gs가 내 글의 gs보다 크거나 같은(=내 글보다 순서가 늦는)

모든글의 gs를 +1   —(A)

gt(탭)

루트gt+1

root

루트no

depth

0

루트의 depth를 +1   —(B)

 

요약하면, n / 조상n / 뤁+1 / 뤁+1 / 루트 / 0 이다.

다만, (A)나와 같은 그룹의, 루트보다 순서가 늦는 글의 순서(gs)를 +1 해주고,

(B)루트의 뎁스를 +1 해주면 된다.

 

3. 삭제한다면

(삭제하는 내 글의 depth가 == 0 이라면)

구분 내 글 처리하는 법 기타
no

DELETE

gi
gs(순서)

gi가 내 글의 gi와 같고,(=같은 그룹이고)

gs가 내 글의 gs보다 큰(=내 글보다 순서가 늦는)

모든글의 gs를 -1

gt(탭)
root
depth 루트의 depth를 -1 

 

(삭제하는 내 글의 depth가 >0 이라면)

구분 내 글 처리하는 법 기타

제목만 삭제되었다고 바꾸기

(del=1)

gi가 내 글의 gi와 같고,

root가 내 글의 root와 같은  게시물<A’>이 모두 del=1이고

나의 루트<B’>가 del=1일때

A’,B’ 모두 DELETE 그리고,

B’의 루트(루트의 루트) depth를 -1

 

​(=그룹번호 내에서 같은 루트의 게시물들이 모두 삭제당했고,

나의 루트마저 다 삭제되었다면

루트부터 아래까지 싹 삭제한다)

 

 

메이븐이란 무엇인가?

메이븐이란 무엇인가?

1. 일단 스프링(sts-3.6.3.SR1)을 다운받아서 하드에 저장해보자.

2. 스프링을 켠다. (C:\ … \sts-bundle\sts-3.6.3.SR1\STS.exe)


3. new-Spring Project 를 클릭해서 새 프로젝트를 만든다.

 


4. 프로젝트 이름을 쓰고, Spring MVC Project를 선택한다.


5. 폴더명을 쓰고 Finish한다. 프로젝트가 만들어졌다.

 

6. 엠 브이 엔 리포지토리(http://mvnrepository.com/) 에 들어가자.


7. “twitter4j”를 쳐서 검색한다. twitter4j-core 를 클릭해서 들어가자.

8. 원하는 버젼 클릭. 4.0.2를 클릭하자.

9. Maven 부분의 소스를 긁는다.

10. 프로젝트의 pom.xml 에 들어간다. <dependency></dependency>를 찾아서 그 부분 위나 아래에 소스를 붙이자.

조금 기다리면 라이브러리를 자동으로 다운받아서 설치해준다.

해당 소스를 지우면 지워준다. 이것이 메이븐이다. 메이븐은 라이브러리를 관리하는 기능 뿐이다.




 

DDL

DDL

 

※ DDL은 오토커밋이다. (커밋을 날리지 않아도 됨)


————————————————————————————————————————


CHAR, VARCHAR2, CLOB(오라클10g) ===> String (getString())
NUMBER ===> int (getInt())
DATE,TIMESTAMP ==> Date (getDate())
BLOB,BFILE ===> InputStream (getInputStream())

————————————————————————————————————————


 

CREATE TABLE sawon_dept(
 deptno NUMBER(4),
 dname VARCHAR2(34) CONSTRAINT sd_nn_dname NOT NULL,
 loc VARCHAR2(100) CONSTRAINT sd_nn_loc NOT NULL,
 CONSTRAINT sd_pk_deptno PRIMARY KEY(deptno)
 );

CREATE TABLE sawon(
 empno NUMBER(4),
 ename VARCHAR2(34) CONSTRAINT sawon_nn_ename NOT NULL,
 job VARCHAR2(20) CONSTRAINT sawon_nn_job NOT NULL,
 mgr NUMBER(4),
 hiredate DATE CONSTRAINT sawon_nn_hiredate NOT NULL,
 sal NUMBER CONSTRAINT sawon_nn_sal NOT NULL,
 comm NUMBER,
 deptno NUMBER(2),
 CONSTRAINT sawon_pk_empno PRIMARY KEY(empno),
 CONSTRAINT sawon_ck_job CHECK(job IN(‘개발부’,’영업부’,’자재부’,’총무부’,’홍보부’)),
 CONSTRAINT sawon_fk_mgr FOREIGN KEY(mgr) REFERENCES sawon(empno),
 CONSTRAINT sawon_fk_deptno FOREIGN KEY(deptno) REFERENCES sawon_dept(deptno)
 );

————————————————————————————————————————

 

DROP TABLE reply;

DROP TABLE board;

CREATE TABLE board(
 no NUMBER,
 name VARCHAR2(34) CONSTRAINT board_nn_name NOT NULL,
 email VARCHAR2(50),
 subject VARCHAR2(1000) CONSTRAINT board_nn_sub NOT NULL,
 content CLOB  CONSTRAINT board_nn_cont NOT NULL,
 pwd VARCHAR2(10) CONSTRAINT board_nn_pwd NOT NULL,
 regdate DATE DEFAULT SYSDATE,
 hit NUMBER DEFAULT 0,
 CONSTRAINT board_pk_no PRIMARY KEY(no)
);

CREATE TABLE reply(
 no NUMBER,
 bno NUMBER,
 id VARCHAR2(20) CONSTRAINT reply_nn_id NOT NULL,
 name VARCHAR2(34) CONSTRAINT reply_nn_name NOT NULL,
 content VARCHAR2(4000) CONSTRAINT reply_nn_cont NOT NULL,
 regdate DATE DEFAULT SYSDATE,
 CONSTRAINT reply_pk_no PRIMARY KEY(no),
 CONSTRAINT reply_fk_bno FOREIGN KEY(bno) REFERENCES board(no)
);

————————————————————————————————————————


 

DROP TABLE 판매전표;
DROP TABLE 제품;
DROP TABLE 전표상세;

CREATE TABLE 제품(
  제품번호 VARCHAR2(12),
  제품명 VARCHAR2(50),
  제품단가 NUMBER CONSTRAINT 제품_ck_제품단가 CHECK(제품단가>0),
  CONSTRAINT 제품_pk_제품번호 PRIMARY KEY(제품번호),
  CONSTRAINT 제품_uk_제품명 UNIQUE(제품명)
);

CREATE TABLE 판매전표(
  전표번호 VARCHAR2(12),
  판매일자 DATE CONSTRAINT 판매전표_nn_판매일자 NOT NULL,
  고객명 VARCHAR2(34) CONSTRAINT 판매전표_nn_고객명 NOT NULL,
  총액 NUMBER CONSTRAINT 판매전표_ck_총액 CHECK(총액>0),
  CONSTRAINT 판매전표_pk_전표번호 PRIMARY KEY(전표번호)
);

CREATE TABLE 전표상세(
  전표번호 VARCHAR2(12),
  제품번호 VARCHAR2(12) CONSTRAINT 전표상세_nn_제품번호 NOT NULL,
  수량 NUMBER CONSTRAINT 전표상세_nn_수량 NOT NULL,
  단가 NUMBER CONSTRAINT 전표상세_nn_단가 NOT NULL,
  금액 NUMBER CONSTRAINT 전표상세_nn_금액 NOT NULL,
  CONSTRAINT 전표상세_pk_전표번호 PRIMARY KEY(전표번호),
  CONSTRAINT 전표상세_fk_전표번호 FOREIGN KEY(전표번호)
                     REFERENCES 판매전표(전표번호),
  CONSTRAINT 전표상세_fk_제품번호 FOREIGN KEY(제품번호)
                     REFERENCES 제품(제품번호),
  CONSTRAINT 전표상세_ck_금액 CHECK(금액>0)
);

—————————————————————

자바스크립트 기초

자바스크립트 기초

<a href=”javascript:del()”>클릭</a>

<head></head>안에서, <title>,<style>밑에 <script>를 넣을것


<script type=”text/javascript”>
var i=0;
function del(){
 var tr=document.getElementById(“del”);
 if(i==0){
  tr.style.display=”;//공백이면 보여주기, none이면 감추기
  i=1;
 }
 else{
  tr.style.display=’none’;
  i=0;
 }
}
</script>

 

/*
 *  var i=0   => int
 *  var i=10.5  => double
 *  var i=”aa”  => String
 *  var i=[]   => 배열
 *  var i={}   => 객체
 *  *** 자바 스크립트에서 태그는 한 개 객체로 인식한다.★★★
 *    $(‘tr#del’).show()
 *    $(‘tr#del’).hide()  //JQuery(=JavaScript 라이브러리): API
 */
 

css기초

css기초

0. 한글 사용

<!–  한글 사용방법: EUC-KR, UTF-8 (U유니코드 T트랜스포트 F포맷. 원래는 ISO-8859 (1바이트)) –>
<meta charset=”EUC-KR”> 혹은<meta charset=”UTF-8″> 을 써야 한글이 나옴.

​데이터베이스 가져오고 넣고, 전송하는 건 전부 UTF-8로 할것

  

1. css 기본

<style type=”text/css”>
th,td{
 font-family: 맑은 고딕;
 font-size: 9pt;
}
a{
 text-decoration: none;/*언더라인 없애기*/
 color:black;
}
a:hover{/* 마우스 오버 */
 text-decoration: underline;
 color: green;
}
</style>

2. 폼을 이용한 css

<form id=”frm”>
<h1><span>회원가입</span></h1>

<input type=”button” value=버튼>

</form>

​———————————-

위와 같은 소스에서, css 주는 법.


<style type=”text/css”>
#frm input[type=”button”] /*버튼 타입은 모두 스타일이 바뀐다.*/

/*위 한 줄은 뒤에 쉼표를 붙이고 계속 이어나갈 수 있다.

다시 말해 #frm input[type=”button”],input[type=”text”],input[type=”password”],input[type=”date”],input[type=”number”],select,textarea 등으로 대체될 수 있다.*/
{
 /*display: block; 테두리를 준다는 뜻*/
 /*text-align:center;*/
 background-color: #fff;/* #fff는 흰색 #000은 검정색*/
 border: 2px solid #F39;/*테두리를 두껍게 만들고, solid는 일반 라인선. 도트가 될수도있고 다시가 될수도있음. #F39는 색깔*/
 padding: 3px 10px;/*톱 레프트*/
 border-radius: 20px;/*반지름. 숫자가 클수록 더 동그래짐*/
}
#frm h1 span{/*<hi>에서 <span>내의 내용을 바꿈*/
 text-align: center;
 display: block;
 color: #fff;
 background-color: #333;
 padding: 5px;
 margin: 0px auto;
}
</style>

HTML 기초

HTML 기초

텍스트 인풋(ex 이름, 이메일, 제목 등): <input type=text size=15>

패스워드 인풋: <input type=password size=10>

텍스트 에어리어(ex 내용 박스): <textarea rows=”8″ cols=”50″></textarea>

글쓰기 버튼: <input type=button value=글쓰기>

취소 버튼: <input type=button value=취소 onclick=”javascript:history.back()”>
 

바깥쪽 표: <table border=1 bordercolor=black width=500 cellspacing=0 cellpadding=0> </table>

               ※표 배경: <!– background=”image/back.jpg” –>

안쪽 표: <table border=0 width=500> </table>

넘버 인풋(ex 나이): <input type=”number” max=”100″ min=”1″ value=”20″>

읽기전용 텍스트인풋 (ex 우편번호, 주소): <input type=text size=45 readonly>

콤보박스(ex 전화번호 국번): <select>
                                   <option>02</option>
                                    <option>031</option>
                                   <option>032</option>
                                   <option>051</option>
                                   </select>

체크박스 :<input type=”checkbox”>운동
             <input type=”checkbox”>게임
             <input type=”checkbox”>등산
             <input type=”checkbox”>당구
             <input type=”checkbox”>낚시

날짜박스(ex 생년월일): <input type=date size=20>

스태틱 영역, 스택 영역, 힙 영역, 콜 바이 밸류, 콜 바이 레퍼런스

스태틱 영역, 스택 영역, 힙 영역

 

1. 정적 메모리(스태틱(Static))

모두가 공유하는 전역 변수, Static이 기억되는 장소이다. 프로그램이 끝날 때까지 기억한다.

프로그램이 시작되면 메모리가 할당되어 있으므로 new를 쓰지 않고 사용가능하다. 예를 들면 영원한 디버깅의 친구 System.out.println의 “out”이 스태틱이다. 사실상 영구적으로(영원히!) 기억한다. 즉, 단 하나의 기억공간을 갖는다.

프로그램에서 공통적으로 사용하고 있고, 메모리 공간 1개를 갖는 변수/메소드/객체가 필요하다면 static을 씁시다.

   ※자바의 정석에서는 ‘메소드 영역’이라고 부르는 듯 하다.

 

2. 스택(Stack)

일반적으로 int, double 등으로 편하게 선언하는 변수들이 스택에 들어간다. LIFO, 다시 말해서 후입선출(Last In Fisrt Out)을 따른다. 변수 영역을 벗어나면 휘발된다. 다시 말해, 블록을 벗어날 때까지 기억한다. 참고로 String str=”a”;는 스택에 저장된다.

 

 

3. 동적 메모리(힙(Heap))

자바에서 new를 쓰면 힙에 저장된다. 새로운 것(뉴)는 힙한 것이기 때문이다.(…는 농담이지만 외우기 편하다)

동적 할당이기에 다소 느리지만 메모리에 영원히(!) 올려두는 스태틱과 달리, 필요할 때 메모리에 올렸다가 해제할 수 있는 특징이 있다.

C에서는 malloc과 free를 이용하지만, 자바에서는 new만 쓰면 된다. 왜냐면 gc(가비지 컬렉터)가 임의로 자동 해제시켜주기 때문이다.

참고로 new String(“a”);는 힙에 저장된다.

 

예를 들면 P라는 클래스가 있고, 피 피는 뉴피(P p=new P();) 로 선언했다고 하자. 이 때 오른쪽의 new P()는 힙에 기억됐다. 다만 왼쪽의 소문자 p는 스택에 기억됐다. P p라는 것은 마치 int p와 비슷한 것으로, (클래스가 사용자 정의형(Type)이기 때문에), 대문자 P는 타입이고, 소문자 p는 변수명일 뿐이다. 소문자 p는 int p와 마찬가지로 스택에 저장된다는 소리다. 다시 말해 p는 주소값을 가질 뿐이다. 그 주소값은 new로 만든 클래스 P(new P();)를 가르키게 된다.

 

따라서 P p=new P(); 처럼 선언하지 않고 new P();로만 썼다면 이 인스턴스를 재사용할 수가 없다. 주소값을 기억하는 변수가 없어서 잃어버렸기 때문이다.

 

★. 콜 바이 밸류(값 호출), 콜 바이 레퍼런스(참조 호출)

int, double, char 등을 프리미티브 타입(primitive: 원시의)이라고 한다. 알다시피 프리미티브 타입은 스택에 저장되고, 레퍼런스 타입은 힙에 저장된다. 여기서 스택의 변수(프리미티브 타입)를 갖다쓰면 콜 바이 밸류가 되고, 힙의 객체(레퍼런스 타입)를 갖다쓰면 콜 바이 레퍼런스가 된다.

 

예를 들어 변수 a를 매개변수로 하는 메소드가 있다고 하자. 메소드 내에서 a값을 이리저리 변경해도, 블록을 빠져나가서 a값을 출력하면 반영되어 있지 않다. 값을 가져다가 쓴 것 뿐이기 때문이다. 이를 콜 바이 밸류라 한다.

 

그러나 클래스 P p를 매개변수로 하는 메소드가 있다고 하자. (여기서 소문자 p는 사실상 클래스 P를 가리키는 포인터이다. 주소값을 가지고 있는 스택 변수.) 이때 클래스 P안의 변수 a값을 변경하고,(P.a++;) 블록을 빠져나가서 다른 곳에서 P.a 값을 출력해도 변경사항이 반영되어 있다. 이를 콜 바이 레퍼런스라 한다.

포인터의 개념

포인터의 개념

 

포인터(Pointer)는 직역하면 ‘가리키는 것’이라는 뜻으로 ‘주소(Address)를 저장한 변수’를 의미한다.

 

포인터와 관련된 연산자는 두 가지가 있는데, 첫째가 & 연산자이고, 두번째가 * 연산자이다.  먼저 & 연산자는 변수의 주소를 구할 때 쓴다. 예를 들어 &i라고 하면 변수 i의 주소값을 구한다. 다음으로 * 연산자는 주소값을 가리킬 때 쓴다. 예를 들어 포인터 변수 p에 &i를 대입하면, *p는 변수 i를 가리키게 된다.

 

좀 더 자세히 설명하자면 다음과 같다.
첫째, *p를 출력하면 변수 i를 출력하게 된다.
둘째, p를 출력하면 변수 i의 주소값을 출력하게 된다.
셋째, *p에 무언가를 대입하면 변수 i에 대입된다.
넷째, p에 변수의 주소값(&j, &k, …)을 대입할 수 있다.

웹개발 시작: 톰캣 세팅, 다이나믹웹프로젝트 세팅

웹개발 시작: 톰캣 세팅, 다이나믹웹프로젝트 세팅

0. 준비

1. 새 프로젝트 만들기

2. 실행하기(서버 세팅)

F11키를 눌러 실행하면 아래와 같이 나온다.

 

아래처럼, 소유하고 있는 톰캣 버젼을 알맞게 선택하고 넥스트를 누른다.

아래처럼 브라우즈 를 눌러서 톰캣이 위치한 폴더를 선택하자.

3. 서버 세팅

아래처럼 Window-Preferences 에 들어간다.

Server에 Runtime Environments 에 들어가서 톰캣을 제외한 서버를 삭제해준다.

 

4. 포트 번호 설정

아래처럼 Servers-Tomcat 폴더 안의 Server.xml을 찾아간다. 하단의 ‘Source’를 클릭해서 소스를 본다. port=”8080″부분을 찾아서 port=”80″으로 바꾸자. 이렇게 하는 이유는, http에서 포트번호 80은 기본포트이므로, URL에 포트번호를 표시하지 않기(=지우기) 위함이다.

 

5. 웹 개발의 구조

(1) 자바 리소스(Java Resource -> src):  -> DTO, DAO (자바파일 들어감)

(2) 웹 콘텐트: html, jsp, js(자바스크립트), css(스타일)

html+java=> jsp

※ html은 화면 디자인(윈도우 창 대신)이라고 보면 된다. html+java은 컴파일이 되면 브라우저에 html(혹은 xml)만 남는다(자바는 사라짐) 브라우저 소스에는 html과 xml만 보일 것이다.




 

싱글톤 패턴

싱글톤 패턴

웹사이트에서 오라클은 한 명이 들어오면 드라이버를 메모리 할당해서 오라클 드라이버(conn)를 연결한다. 그 후 브라우저를 종료하면 오라클 연결을 끊는다.(ps.close(), conn.close())

다시 말해 접속이 이뤄질 때마다 소켓(드라이버 안에 존재)을 연결하고 끊고, 하는 식으로 객체 갯수를 1개로 유지한다. 왜냐하면 브라우저를 껐을 때 드라이버 연결을 닫아주지 않으면, 오라클에 부하가 심하게 걸리기 때문이다. 이를 싱글톤 패턴이라고 한다.

팩토리 패턴

팩토리 패턴

 

RANK 함수

RANK 함수

RANK 함수: 순위 결정

RANK() OVER(ORDER BY sal DESC)
※ DESC가 생략되면 ASC

SELECT ename,sal,deptno,RANK() OVER(ORDER BY sal DESC) AS rank FROM emp;

SELECT ename,sal,deptno,RANK() OVER(ORDER BY sal DESC) AS rank FROM emp WHERE deptno=10;

SELECT ename,sal,deptno,RANK() OVER(ORDER BY sal DESC) AS rank FROM emp WHERE deptno=20;

SELECT ename,sal,deptno,RANK() OVER(ORDER BY sal DESC) AS rank FROM emp WHERE deptno=30;

SELECT ename,sal,deptno,RANK() OVER(PARTITION BY deptno ORDER BY sal DESC) AS rank FROM emp;

DML

DML 

 

■ INSERT(데이터 추가)

 

  1. 전체 데이터 추가

     INSERT INTO table_name VALUES(…)

      => 값은 숫자 외의 모든 데이터

  2. 원하는 데이터 추가

     INSERT INTO table_name(column…)

     VALUES(…)

 

UPDATE(데이터 수정)

 

  UPDATE table_name SET

  col=, col=

  WHERE 조건

  =>WHERE 조건을 붙이지 않으면 데이터가 싹다 바뀜! 주의!


 

DELETE(데이터 삭제)

 

  DELETE FROM table_name

  WHERE 조건

CURD 프로그램 (CREATE, UPDATE, READ, DELETE) = 오라클

–테이블 만들기(테이블 복사)
CREATE TABLE myEmp
AS
SELECT * FROM emp;

–DDL(CREATE, ALTER, DROP)은 COMMIT 필요없음(오토커밋)


–테이블 확인
SELECT * FROM myEmp;


–추가
INSERT INTO myEmp VALUES((SELECT MAX(EMPNO)+1 FROM myEmp),’홍길동’,’대리’,7788,’12/02/03′,3000,100,40);
INSERT INTO myEmp VALUES((SELECT MAX(EMPNO)+1 FROM myEmp),’성춘향’,’대리’,7788,’13/02/03′,3000,100,40);
INSERT INTO myEmp VALUES((SELECT MAX(EMPNO)+1 FROM myEmp),’이몽룡’,’사원’,7788,’14/02/03′,2500,100,40);
INSERT INTO myEmp VALUES((SELECT MAX(EMPNO)+1 FROM myEmp),’이산’,’사원’,7788,’15/02/03′,2500,100,40);
INSERT INTO myEmp VALUES((SELECT MAX(EMPNO)+1 FROM myEmp),’임꺽정’,’사원’,7788,’15/02/03′,2500,100,40);

COMMIT;

–추가2

INSERT INTO myEmp(empno,ename,job,hiredate,sal,deptno) VALUES ((SELECT MAX(empno)+1 FROM myEmp),’심청이’,’사원’,SYSDATE,2400,10);

COMMIT;

–수정

UPDATE myEmp SET ename=’강감찬’,sal=3500,deptno=20 WHERE empno>=7935;
ROLLBACK;

–결과를 확정짓기 전 롤백을 사용하면 되돌린다


–삭제

DELETE FROM myEmp WHERE empno>=7935;

COMMIT;

–테이블 드랍

DROP TABLE myEmp;

–DDL(CREATE, ALTER, DROP)은 COMMIT 필요없음(오토커밋) 

서브쿼리

서브쿼리

단일행 서브쿼리 / 다중행 서브쿼리

상호연관 서브쿼리

 

<단일행 서브쿼리>
–월급 많은 순으로 5개 가져오기
–★★★페이지 가져올때 쓰인다!
SELECT ename,sal,rownum FROM (SELECT ename,sal FROM emp ORDER BY sal DESC) WHERE rownum<=5;

–전체 평균보다 작은 급여를 받는 사원의 이름, 급여, 입사일 출력
SELECT ename,sal,hiredate FROM emp WHERE sal<(SELECT AVG(sal) FROM emp);

–SALES부서에서 가장 많이 받는 사원의 급여
SELECT MAX(sal) FROM emp WHERE deptno=(SELECT deptno FROM dept WHERE dname=’SALES’);

–SMITH보다 급여를 많이 받는 사원의 급여와 이름
SELECT sal,ename FROM emp WHERE sal>(SELECT sal FROM emp WHERE ename=’SMITH’);

–BLAKE와 같은 부서에서 근무하는 사원의 이름,급여,입사일
SELECT ename,sal,hiredate FROM emp WHERE deptno=(SELECT deptno FROM emp WHERE ename=’BLAKE’);

<다중행 서브쿼리>
–이름 중에 T를 포함하고 있는 사원과 같은 부서에서 근무하는 사원의 이름, 부서번호, 급여 출력
SELECT ename,deptno,sal FROM emp WHERE deptno IN(SELECT deptno FROM emp WHERE ename LIKE ‘%T%’);

–30번 그룹에서 최고 급여보다 더 많이 받는 사원의 이름,급여
SELECT ename,sal FROM emp WHERE sal>(SELECT MAX(sal) FROM emp WHERE deptno=30);

–또는
SELECT ename,sal FROM emp WHERE sal>ALL(SELECT sal FROM emp WHERE deptno=30);

–DALLAS에서 근무하는 모든 사원의 이름, 급여, 입사일
SELECT ename,sal,hiredate FROM emp WHERE deptno=(SELECT deptno FROM dept WHERE loc=’DALLAS’);

<다중 컬럼> (거의 등장하지 않는다)
–아래 쿼리문은 어떤 의미인가?
SELECT deptno,ename,sal
FROM emp
WHERE (deptno,sal) IN(SELECT deptno,MAX(sal) FROM emp GROUP BY deptno) ORDER BY deptno;

<상호연관>
SELECT ename,job,sal FROM emp e1
WHERE sal>=(SELECT AVG(sal) FROM emp e2 WHERE e1.job=e2.job);
–직위별로 평균보다 연봉 높은사람

<스칼라 서브쿼리>
SELECT ename,(SELECT dname FROM dept WHERE emp.deptno=dept.deptno) dname FROM emp;
–아래와 같은 의미.

SELECT ename,dname FROM emp,dept WHERE emp.deptno=dept.deptno;
–but, 왜 스칼라 서브쿼리를 쓰느냐? 데이터 양이 적을 때는 조인보다 스칼라가 빠름(데이터가 많을 때는 조인이 빠를수도)

INNER JOIN, OUTER JOIN

INNER JOIN, OUTER JOIN



FULL OUTER JOIN은 UNION으로 대체할 수 있으며, 거의 등장하지 않는다.

JOIN (Inner, Outer, Self)

JOIN (Inner, Outer, Self)

 

구분 이름 내용 비고
INNER JOIN EQUI-JOIN

–Oracle Join

SELECT A.col, B.col

FROM A,B

WHERE A.col=B.col; 

–Ansi Join

(A,B의 컬럼명이 달라도 ok)

SELECT A.col, B.col

FROM A JOIN B

WHERE A.col=B.col; 

–NATURAL JOIN (자연조인)

(A,B 같은 컬럼명이 존재해야 함)

SELECT col1,col2,col3

FROM A NATURAL JOIN B

–JOIN USING

(A,B 같은 컬럼명이 존재해야 함) 

SELECT col1,col2,col3

FROM A JOIN B USING(col)

NON-EQUI-JOIN

관계연산자(>,<,>=,<=) 혹은

BETWEEN~AND 를 씀

OUTER JOIN LEFT OUTER JOIN
RIGHT OUTER JOIN
FULL OUTER JOIN
SELF JOIN

조인 

1. EQUI-JOIN

–(1)오라클 조인
SELECT ename,hiredate,sal,dname,loc
FROM emp,dept
WHERE emp.deptno=dept.deptno;

–(2)안시 조인
SELECT ename,hiredate,sal,dname,loc
FROM emp JOIN dept
ON emp.deptno=dept.deptno;

–(3)내츄럴 조인
SELECT ename,hiredate,sal,dname,loc
FROM emp NATURAL JOIN dept;

–(4)조인유징
SELECT ename,hiredate,sal,dname,loc
FROM emp JOIN dept USING(deptno);

ex) 30번 부서에 근무하는 사원의 이름, 직위, 부서명, 근무지 출력

SELECT ename,job,dname,loc
FROM emp,dept
WHERE emp.deptno=dept.deptno AND emp.deptno=30;

ex) A가 포함된 사원의 이름, 부서명, 입사일을 출력
SELECT ename,dname,hiredate
FROM emp,dept
WHERE emp.deptno=dept.deptno AND ename LIKE ‘%A%’;

ex) COMM을 받는 사원의 이름,근무지,급여,성과급(단, 0을 받는 사원은 제외)
SELECT ename,loc,sal,comm
FROM emp, dept
WHERE emp.deptno=dept.deptno AND comm IS NOT NULL and comm<>0;

ex) DALLAS에서 근무하는 사원의 이름과 부서번호
SELECT ename,dept.deptno
FROM emp,dept
WHERE emp.deptno=dept.deptno AND dept.loc=’DALLAS’;
deptno는 컬럼이 양쪽에 중복되므로, 앞에 테이블명 붙여줘야함

 

2. NON-EQUI-JOIN 

NON-EQUI-JOIN
SELECT ename,sal,grade,losal,hisal
FROM emp,salgrade;

–위를 아래와 같이 변경해보자.

SELECT ename,sal,grade,losal,hisal
FROM emp,salgrade
WHERE sal BETWEEN losal AND hisal;

ex) 사원 정보 중에 이름, 급여, 입사일, 부서명, 근무지, 급여등급

SELECT ename,sal,hiredate,dname,loc,grade
FROM emp, dept, salgrade
WHERE emp.deptno=dept.deptno
AND sal BETWEEN losal AND hisal;

3. OUTER JOIN

3-1. 레프트 아우터 조인(오라클 타입)

 –본인이름, 사수의 이름
SELECT e1.ename “본인”, e2.ename “사수”
FROM emp e1,emp e2
WHERE e1.mgr=e2.empno(+);

 

–사수(오른쪽)가 값이 없어도(NULL) 가져옴

–널값이 있는 곳에 플러스를 붙여줌

–플러스를 붙인 곳(=널값이 있는 곳=오른쪽)의 반대편이 조인의 이름임(레프트 아우터 조인)

–레프트 아우터 조인: 오른쪽이 널값이어도 왼쪽값을 가져옴

3-2. 레프트 아우터 조인(안시 타입)

 –본인이름, 사수의 이름
SELECT e1.ename “본인”, e2.ename “사수”
FROM emp e1 LEFT OUTER JOIN emp e2
ON e1.mgr=e2.empno;

 

4. SELF JOIN 

셀프조인
–본인이름, 사수의 이름
SELECT e1.ename “본인”, e2.ename “사수”
FROM emp e1,emp e2
WHERE e1.mgr=e2.empno;

ex) BLAKE 사원보다 늦게 입사한 사원들의 이름,부서명, 입사일

–<셀프조인으로 풀기>

SELECT e1.ename,dname,e1.hiredate
FROM emp e1,dept,emp e2
WHERE e1.deptno=dept.deptno
AND e2.ename=’BLAKE’ AND e1.hiredate>e2.hiredate;

–<서브 쿼리로 풀기>

SELECT ename,dname,hiredate
FROM emp,dept
WHERE emp.deptno=dept.deptno
AND hiredate>(SELECT hiredate FROM emp WHERE ename=’BLAKE’); 

SELECT와 연산자

SELECT와 연산자

–DESC: 테이블이 가지고 있는 컬럼 확인

DESC 테이블명;

–SELECT: 데이터 검색이라고 보면 됨

SELECT * FROM 테이블명;

SELECT column1,column2,column3| *

  FROM 테이블명

  [

  WHERE

  GROUP BY  HAVING

  ORDER BY

  ]


별명 주는 법 세가지

SELECT empono사번“,ename이름“,job “직위” FROM emp;

SELECT empono AS 사번,ename AS 이름,job AS 직위 FROM emp;

SELECT empono 사번,ename 이름,job 직위 FROM emp;

연산자 (WHERE 관련)

1. 산술연산자( +, -, *, / (실수))

2. 관계연산자( =, <, >, <=, >=, !=)

                                             <>

— 급여가 1500보다 큰 사원의 이름과 급여
SELECT ename,sal FROM emp WHERE sal>1500;
SELECT ename,sal FROM emp WHERE sal<3000; 


3. 논리연산자( AND , OR )

4. 대입연산자( = )

***** WHERE 절 안에서 = (같다)

    UPDATE emp SET
    ename=’홍길동’
    WHERE empno=7788;

5. BETWEEN ~ AND : 기간, 범위

    BETWEEN 10 AND 20     (10하고 20이 포함되고 있다)
    (10<= AND 20>=) 

6. IN (10,20,30)

7. LIKE : 유사문자열 검색
    ‘A%’, ‘%T’, ‘%A%’, ‘__A%’
    A% A로 시작하는 모든 문자열
    %T T로 끝나는 모든 문자열
    %A% A를 포함되어 있는 모든 문자열
    __A% 세번째 자리에 A가 있는 모든 문자열
 

   %: 문자열
    _: 문자 한개

8. NULL
    IS NULL : NULL값이라면
    IS NOT NULL : NULL값이 아니라면

9. NOT 부정 연산자 

JSP 모델1: DAO/DTO

JSP 모델1: DAO/DTO

JSP 모델1은 세 부분으로 나뉜다.

1. DTO 2. DAO 3. 메인 클래스

1. DTO (Data Transfer Object, Value Object)

데이터를 담는 클래스다.

(1)프라이빗으로 변수를 선언한 후, (2)게터세터를 적용시키자.

(프리이빗으로 데이터를 은닉화하고, 게터세터를 통해 데이터를 빼낼 수 있도록 만든다)

2. DAO (Data Access Obeject)

데이터를 접근하기 위한 클래스다.

우선 (1)생성자에서 Class.forName으로 드라이버를 불러온다.

여기서 데이터를 로우 단위로(한 줄) 가져와 어레이리스트에 넣는다고 하자. 어레이리스트 제네릭스Type은 DTO다.

getConnection(conn 선언) -> ps 선언(sql을 대입) -> rs 선언(ResultSet) -> rs.next -> rs.close -> disConnection(ps끊고 conn끊음)

결국 conn-ps-rs-!ps-!conn 순이다.

3. 메인 클래스

(1) DAO는 뉴로 생성,

(2) 어레이리스트 선언(제네릭스Type은 DTO)하고,

(3) 포문 돌려서 받아오면 된다.

JSP 이해

JSP 이해

1. JSP는 꺽쇠<>로 묶이는 html과 퍼센트꺽쇠<% %>로 묶이는 java코드가 섞여 비효율적이고 코딩을 하기 어렵다. 따라서 View, Model, Controller 셋으로 구조를 나누는 MVC패턴이 발전했다. View는 디자이너가 만들고, Model은 개발자가 만든다. 이 둘을 묶어주는 Controller는 미리 만들어져 있다. 스프링, 스트러츠가 그것이다.

2. JSP에서 개발자는 DAO와 DTO라는 클래스를 반드시 만든다. DTO는 데이터만 담겨있는 클래스, DAO는 데이터를 갖고오는 클래스이다. 말 그대로 “Data Type(데이터형) Object”는 데이터형을 저장하고, “Data Acess(접근) Object”는 데이터를 접근해서 가져온다.

3. 개발자는 오라클에서 DAO를 통해 데이터를 가져와서 DTO에 담게 되는데, 이때 직접적으로 접근할 수 없고 드라이버를 통해야 한다. 우리가 쓰는 무료 드라이버를 ‘씬 드라이버’라고 하며, 단지 연결만 시켜줄 뿐이기에 각종 기능은 우리가 만들어야 한다.(빠른 속도의 유료 드라이버로는 OCI가 있지만, 거의 쓰이지 않는다)

4. 웹사이트의 개발 단계는 다음과 같다. 요구사항을 PM이 받고, DBA가 DB를 설계하고, 디자이너가 디자인을 마친 후, 개발자는 요구사항/DB/디자인에 맞춰 사이트를 개발한다.

 

5. DTO 작성

DTO는 데이터 타입을 담는 곳이다. 데이터는 어레이리스트로 담게 되는데, 표(DB)에서 한 줄(레코드)씩을 가져와 넣게 된다.

DB설계 상황을 보려면 오라클에 접속한 후, 아래처럼 DESC emp;를 날려 테이블에 어떤 칼럼이 있는지 보고, 컬럼 갯수와 형태를 알 수 있다.

VARCHAR2는 String으로 가져오면 되고,

NUMBER는 (SELECT를 날려 실제 데이터 모양을 본 후) Int나 Double로 가져오면 되고,

DATE는 Date로 가져오면 된다.

6. DAO는 캡슐화되어야 한다. 변수를 private으로 선언했으므로, 다른 곳에서 가져다 쓸 수 있도록 게터세터를 써야 한다. 이클립스에서 마우스 우클릭 -> Source -> Generate Getters and Setters 로 게터세터를 만들 수 있다.


 

7. JSP를 위해서는 클래스 4개를 알아야 한다. 내용은 아래와 같다.


8. 오라클에 연결하기 전, 오라클의 네트워크 폴더에 들어가 listener.ora 파일을 열어서 ip주소와 포트번호를 제대로 맞춰줘야 한다.




 

SQL 내장함수

SQL 내장함수


문자: SUBSTR, INSTR, LENGTH, RPAD

숫자: ROUND, TRUNC, MOD, CEIL

날짜: SYSDATE, MONTHS_BETWEEN, LAST_DAY, ROUND, TRUNC

변환: TO_CHAR

일반: NVL


구분 내용 비고
문자형 CHAR 1~2000 Byte (고정데이터형)
VARCHAR2 1~4000 Byte (가변)
CLOB 4GB
숫자형 NUMBER(4) 0~9999
NUMBER(7.2) 99999.99 전체자리.소수자리
날짜형 Date .
Timestamp 100만분의 1초: 경주, 올림픽..
BLOB Binary 형태 동영상,그림
BFILE File 형태 동영상,그림

 

※ 펑션과 프로시저의 차이 : 리턴형이 있다(Function:함수) / 없다(프로시저) 

 

구분 내용 비고
변환 TO_CHAR

문자열 변환 

TO_CHAR(날짜,숫자,’변경’)

(YYYY-MM-DD HH24:MI:SS)

HH24 라 써야 24시가 나옴.

그냥 HH라 쓸거면 오전, 오후로 나오는걸 우리가 만들어야 함

TO_CHAR(sal, ‘$9999’)

800 => $800

TO_CAHR(sal, ‘$99,999)

70000 => $70,000

9 는 1자리 의미

0 은 빈자리를 0으로 표시

$ 는 $를 붙임

L 은 \을 붙임

. 은 소수점 이하표시

, 는 천단위 구분기호 표시

일반 NVL NULL값을 다른값으로 변경

SQL 단일행 함수 

 

■ 문자 함수

구분 내용 비고
변형 INITCAP 1~2000 Byte (고정데이터형)
UPPER 1~4000 Byte (가변)
LOWER 4GB
제어 SUBSTR(문자,시작,갯수) 문자를 잘라내옴 (첫번째 문자는 1)
INSTR(문자열,’찾는문자’,시작위치,몇번째인지(기본값1))

INSTR(ABABAB,’A’,1)=>1

INSTR(ABABAB,’B’,-1)=>6

INSTR(ABABAB,’A’,1,2)=>3 

INSTR(ABABAB,’A’,-1,3)=>1

채우기 LPAD

LPAD(‘abc’,7,’#’) => ####abc

RPAD ..
TRIM LTRIM

LTRIM(‘ abcd’)=>’abcd’

LTRIM(‘abca’,’a’)=>’bca’

LTRIM(‘a bcd’,’a’)=>’ bcd’

RTRIM RTRIM(‘abca’,’a’)=>’abc’
기타 LENGTH

숫자 함수 

구분 내용 비고
ROUND ROUND

ROUND(123.78, 2)=>123.78

ROUND(123.78, 1)=>123.8

TRUNC

ROUND(123.78, 1)=>123.7

MOD MOD(5,2)=>5%2=>1
CEIL

 

날짜 함수 

구분 내용 비고
SYSDATE

시스템 날짜, 시간

SYSDATE-1

SYSDATE+1 

90일 뒤라면 +90
MONTHS_BETWEEN MONTHS_BETWEEN(현재, 입사)
ADD_MONTHS ADD_MONTH(hiredate, 6)
LAST_DAY

2월 넘기면 2월 28일 나옴

12월 넘기면 12월 31일 나옴

(윤년까지 반영)

NEXT_DAY

(‘2015-03-13′,’금’)

이 다음날부터 따져서 첫번째

돌아오는 금요일을 찾음=>3월 20일

■ DECODE

(스위치 케이스와 비슷하다)

SELECT ename,DECODE(deptno,10,’영업부’,

                                               20,’개발부’,

                                               30,’총무부’) AS dname FROM emp;

CASE

(다중이프 문과 비슷하다)

SELECT ename,CASE WHEN deptno=10 THEN ‘영업부’

                                WHEN deptno=20 THEN ‘개발부’

                                WHEN deptno=30 THEN ‘총무부’

                       ELSE ‘신입사원’

                       END dname

FROM emp;

※ case문은 콤마를 찍지 않는다.

■ 복수행함수

COUNT : 회원가입 중복체크에 씀. COUNT해서 1이면 중복, 0이면 생성가능

SUM

AVG

MAX : 게시판 자동증가번호에 씀. MAX+1 하면 새로운 게시판번호

MIN

RANK

구분 내용1 내용2 내용3
COUNT ROW의 갯수

COUNT(*)

※전부 셀 경우 널값 포함

COUNT(column)

컬럼명 적용시 널값은 제외한다

ex)회원가입시 아이디 중복체크

SUM, AVG
MIN, MAX ex)예약번호 max치에 +1 자동증가
RANK ex)조회수 순으로 정렬

그룹바이

–한 개 묶기

SELECT deptno,ROUND(AVG(sal),2),SUM(sal),MAX(sal),MIN(sal)
FROM emp
GROUP BY deptno;

–두 개묶기​

SELECT deptno,job,ROUND(AVG(sal),2),SUM(sal),MAX(sal),MIN(sal)
FROM emp
GROUP BY deptno,job;

–그룹 안에서 조건주기

–같은 부서의 인원수가 4명 이상인 업무와 인원수를 출력

SELECT deptno,count(*)

FROM emp

GROUP BY deptno

HAVING COUNT(*)>=4;

참조변수의 형변환

참조변수의 형변환

클래스 3개가 있다고 하자. Gp(할아버지), P(아버지), C(자식)가 있다. 여기서 GP를 P가 상속받고, P를 C가 상속받았다고 하자.

함수의 기능은 다음과 같다고 해보자.

Gp{ “할아버지”를 출력하는 메서드; }

P{ “아버지”를 출력하는 메서드; }

C{ “자식”을 출력하는 메서드; }

이때 Gp gp = new gp(); 하고 클래스 Gp에서 출력하는 메서드를 쓴다면 당연히 “할아버지”가 출력된다.

P p = new p(); 하고 클래스 P에서 출력한다면 “아버지”가 출력된다.

C c = new c(); 하고 클래스 C에서 출력한다면 “자식”이 출력된다.

그러나 여기서, 자식은 부모집에 들어갈 수 있다. (상속받은 클래스는 부모 클래스 안에 들어갈 수 있다)

예컨대,

gp=p; //할아버지에 아버지 대입  (Gp gp=new p();)

p=c; //아버지에 자식 대입          (P p=new c();)

gp=c; //할아버지에 자식 대입     (GP gp=new c();)

이 가능하다. (반대로 p=gp; c=p; c=gp 는 불가능하다.)

만약 gp=p; 해서 클래스 Gp에서 출력하는 메서드를 쓴다면 “아버지”가 출력된다. gp에 p가 들어왔기 때문이다. 다시 말해, gp의 메서드를 p가 덮어썼다.

이것은 변수 a=1; 을 써놓고, a=2;라고 쓴 후 a를 출력하면 2가 나오는 원리와 똑같다. 원래 클래스 Gp에는 <“할아버지” 출력메서드>가 들어있었으나 클래스 p를 대입했으므로 p의 클래스들이 Gp 안에 들어갔기 때문이다.

아래는 전부 같은 원리로 작동한다.

gp=p; 한다면 Gp에서 출력하면 “아버지”가 출력,

p=c; 한다면 P에서 출력하면 “자식”이 출력,

gp=c; 한다면 Gp에서 출력하면 “자식”이 출력된다.

추상메서드와 인터페이스의 차이

추상클래스와 인터페이스의 차이

추상클래스는 “abstract class 클래스명” 식으로 만들어져있다. 그 안에는 무조건 추상메서드가 1개 이상 있어야 한다. 추상메서드 안에는 “abstract void disp(){}” “abstract void input(){}”식으로 구현되지 않은 메서드들이 들어있다. 그러나 일반메서드들도 같이 들어있을 수 있다.

인터페이스는 “interface 인터테이스명” 식으로 만들어져 있다. 안의 변수는 상수형 변수(public static final)이다. 인터페이스는 추상메서드가 들어있다는 점에서 일종의 추상클래스이다. 그러나 추상클래스와의 큰 차이점은, 일반메서드는 들어있지 않고, 오직 추상메서드만 들어있다. 거기다 다중상속이 가능하다.


정리하면 추상클래스는 멤버변수, 추상메소드+일반메소드,단일 상속 인데 반해, 인터페이스는 상수형 변수, only 추상메소드, 다중상속할 수 있다는 차이가 있다.

퀀텀DB 플러그인과 오라클 연동

퀀텀DB 플러그인과 오라클 연동

1. 퀀텀DB를 다운받는다.

주소는 http://sourceforge.net/projects/quantum/files/

2. 퀀텀DB를 다운받아 압축을 푼다. 퀀덤디비 features 폴더 속의 내용을 이클립스 features 폴더 속으로 옮기고, 퀀텀디비 plugins 폴더 속의 내용을 이클립스 plugins 폴더 속으로 옮겨야 한다.

3. 이클립스를 실행하여 우측 상단의 Open Perspectives로 퀀텀 디비를 연다.

4. 퀀텀디비 좌측 북마크에서 마우스 우클릭을 하며 New Bookmark를 고른다. (기존에 있는 Bookmark는 지우자)
 

 

5. New Bookmark 창에서 ADD driver를 클릭한다.

6. New JDBC Driver 창이 뜨면 ADD External Jar를 클릭한다.

 

7. C:\app\내 컴퓨터의 유저네임\product\자바버전(여기서는 11.2.0)\dbhome_1\jdbc\lib 안의 ojdbc6.jar를 선택한다. 못찾겠으면 윈도우 탐색기로 ojdbc6.jar를 검색해보자.
 

8. Finish를 눌러 New JDBC Driver 창으로 돌아오자. Browse를 클릭하여 oracle.jdbc.driver.OracleDriver 를 고르자.


9. Finish를 눌러 New Bookmark 창으로 돌아오자. oracle.jdbc.driver.OracleDriver 를 선택하고 Next 한다.

10. Userid 에 오라클 아이디와 패스워드를 적자. 여기서는 아이디는 scott, 패스워드는 tiger를 적었다. Database name은 orcl 을 주고, Next 누른다.


 

11. 북마크 네임을 mydb 라고 주고 Finish 누른다.


 

12. 이제 퀀텀DB를 쓸 수 있다.

13. 우편번호(zipcode) sql 파일로 잘 돌아가는지 확인해보자.

아래와 같은 파일이 있다.

14.

15.

16. commit; 한다.

17.

 

트위터 api로 텍스트 가져오기

트위터 api로 텍스트 가져오기

 


 

package com.sist.test;

import twitter4j.FilterQuery;
import twitter4j.TwitterFactory;
import twitter4j.TwitterStream;
import twitter4j.TwitterStreamFactory;

public class TwitterMain {

 public static void main(String[] args)
 throws Exception{
  // TODO Auto-generated method stub
  TwitterStream ts=new TwitterStreamFactory().getInstance();
  TwitterListener list=new TwitterListener();
  ts.addListener(list);
  String[] data={“설날”,”떡국”,”교통”};
  FilterQuery fq=new FilterQuery();
  fq.track(data);
  ts.filter(fq);
  
 }

}

—————————————————————————-

package com.sist.test;

import twitter4j.StallWarning;
import twitter4j.Status;
import twitter4j.StatusDeletionNotice;
import twitter4j.StatusListener;

public class TwitterListener implements StatusListener {

 @Override
 public void onException(Exception e) {
  // TODO Auto-generated method stub
  
 }

 @Override
 public void onDeletionNotice(StatusDeletionNotice arg0) {
  // TODO Auto-generated method stub
  
 }

 @Override
 public void onScrubGeo(long arg0, long arg1) {
  // TODO Auto-generated method stub
  
 }

 @Override
 public void onStallWarning(StallWarning arg0) {
  // TODO Auto-generated method stub
  
 }

 @Override
 public void onStatus(Status status) {
  // TODO Auto-generated method stub
  System.out.println(“@”+status.getUser().getScreenName()+”-“+status.getText());
  
 }

 @Override
 public void onTrackLimitationNotice(int arg0) {
  // TODO Auto-generated method stub
  
 }

}

—————————————————————————-

twitter4j.properties

oauth.consumerKey=tO0JKKsp58TaLEBqNTXX2Qjt7
oauth.consumerSecret=mP2L0NDoNDx5CZRpKeqeuOnp9Xm99p4epJiZewJwDeoNMgxHAt
oauth.accessToken=3023424703-elpk7oZiFdN22iD0V63w1yxxMnwAFZc8oSdJi4Z
oauth.accessTokenSecret=2aihnAo1XLU7AmslZoVDAD30v61WofQ5jre9trUDyx4wH

—————————————————————————-

  <!– Spring –>
  <dependency>
   <groupId>org.twitter4j</groupId>
   <artifactId>twitter4j-core</artifactId>
   <version>4.0.2</version>
  </dependency>
  
  <dependency>
   <groupId>org.twitter4j</groupId>
   <artifactId>twitter4j-stream</artifactId>
   <version>4.0.2</version>
  </dependency>

오라클 기초

오라클 기초

1. 관계형 DB, 모델링, 파일시스템

로우        튜플              레코드

컬럼        어트리뷰트      필드

2. DML, DDL, DCL, TCL

3. 오라클 서비스 세팅

작업관리자->서비스에서 아래와 같이 만든다.

(특히, OracleServiceORCL 실행중)

 


4. SQL Plus 세팅

실행해서

SET linesize 200;

SET pagesize 20;

등으로 보기 편하게 세팅할 수 있다.

5. SQL Plus 실행
SQL Plus를 관리자 권한으로 실행해서, scott/tiger로 접속한다.
 

conn scott/tiger 로 접속한다.

 

ed test 를 치면 test.sql파일을 수정할 수 있다. 

저장하고 끈 후, @test 를 치면 내용을 실행한다.

ex) SELECT * FROM tab;

      SELECT * FROM emp;

6. SELECT문

SELECT / FROM / [WHERE / GROUP BY + HAVING / ORDER BY]

독학사 1단계 초급통계학 시험범위

독학사 1단계 초급통계학 시험범위

학점은행제로 “컴퓨터공학”과 학위를 취득하고자 할 경우, 초급통계학은 “전공선택” 과목으로 4학점 인정됩니다.

1. 서론

. 통계학이란 무엇인가?

. 모집단과 표본

. 기술통계학과 추리통계학

 

2. 기술통계

. 도수분포표와 그래프

. 대표값

. 산포도

 

3. 확률과 확률변수

. 표본공간과 사상

. 사상의 확률

. 조건부 확률

. 사상의 독립

. 확률변수와 분포

. 기대치와 그 성질

. 두 확률변수의 결합분포

. 기대치와 그 성질

. 공분산과 상관계수


4. 확률분포

. 베르누이 시행

. 이항분포

. 연속확률분포

. 정규분포

. 이항분포의 정규근사

 

5. 표본분포

. 확률표본

. 통계량의 표본분포

. 정규모집단에서의 표본분포

. 표본평균의 분포와 중심극한 정리

 

6. 추정

. 점추정

. 구간추정

  

7. 가설검정

. 검정의 원리

. 모평균의 검정

. 모비율의 검정

. 두 모평균의 차에 관한 검정

. 두 모비율의 차에 관한 검정

8. 분할표

. 다항분포

. 카이제곱분포

. 적합도 검정

. 분할표


9. 단순회귀분석

. 회귀분석의 개념

. 단순회귀식의 최소제곱법에 의한 적합

. 단순회귀분석에서의 추정과 검정

10. 분산분석 : 일원배치법

  

11. 비모수통계

. 윌콕슨 순위합검정

. 윌콕슨 부호순위검정 

독학사 1단계 전산개론 시험범위

독학사 1단계 전산개론 시험범위

학점은행제로 “컴퓨터공학”과 학위를 취득하고자 할 경우, 전산개론은 “전공선택” 과목으로 4학점 인정됩니다.

대 영 역

중 영 역

소 영 역

1. 정보사회와 컴퓨터

. 정보사회와 정보혁명

 

. 정보통신기술과 뉴미디어

 

. 컴퓨터시스템의 구성과 기능

1. 하드웨어와 소프트웨어

2. 컴퓨터시스템의 기본

  기능

. 컴퓨터 프로그램과 데이터

 

. 컴퓨터 요원

 

. 컴퓨터의 종류

1. 개인용 컴퓨터

2. 미니 컴퓨터

3. 서버 컴퓨터

4. 범용 컴퓨터

5. 슈퍼 컴퓨터

6. 전용 컴퓨터

2. 컴퓨터와 통신산업의 발전

 

. 초창기의 계산도구

 

. 전자식 계산기의 등장

 

. 프로그램 내장 방식

 

. 컴퓨터산업의 발전단계

1. 컴퓨터산업의 제1세대(1950~57):진공관 시대

2. 컴퓨터산업의 제2세대(1958~63):트랜지스터 시대

3. 컴퓨터산업의 제3세대(1964~71):집적회로 시대

4. 컴퓨터산업의 제4세대(1972~?):고밀도 및 초고밀도 집적회로 시대

. 컴퓨터와 통신의 결합

 

. 마이크로프로세서의 발전

 

. 소프트웨어산업의 발전

1. 프로그램의 필요성

2. 고급언어의 개발

3. 운영체제의 발전

. 컴퓨터산업의 미래

 

3. 처리장치와 데이터 처리

. 처리장치의 개요

 

. 데이터의 저장과 표현

1. 수치 데이터의 표현

2. 문자 데이터의 표현

. 주기억장치 주소와 데이터 저장

 

. 컴퓨터명령어의 형태와 실행

 

. 기억장치의 발달 과정과 반도체기억장치

1. 주기억장치의 발달 과정

2. 반도체기억장치

.데이터 처리

1. 데이터 입력

2. 데이터 처리

3. 결과 출력

4. 컴퓨터 입출력

 

. 입출력의 개요

 

. 데이터 입력

1. 일괄처리용 입력장치

2. 거래지향처리용 입력장치

3. 기타 컴퓨터 입력장치

. 입력 데이터 편집

1. 일괄처리용 출력장치

2. 거래지향처리용 출력장치

3. 기타 컴퓨터 출력장치

. 거래지향처리의 처리주기

 

. 입출력의 미래

 

5. 보조기억장치와 데이터 저장

. 보조기억장치의 개요

 

. 순차접근 기억장치

1. 자기테이프의 종류

2. 자기테이프의 데이터 저장

3. 자기테이프에 저장된 레코드의 형태

. 직접접근 기억장치

1. 플로피디스크

2. 하드디스크

3. 광디스크

. 대량기억장치

 

. 저장장치의 미래 전망

 

6. 소프트웨어

. 개요

 

. 시스템 소프트웨어

1. 운영체제

2. 언어번역기

3. 유틸리티 프로그램

. 응용 소프트웨어

1. 사용자 프로그램

2. 응용패키지 프로그램

3. 멀티미디어 도구

. 기타 소프트웨어

1. 데이터베이스 관리 시스템

2. 통신 소프트웨어

7. 프로그래밍

. 프로그래밍 언어의 구분

1. 저급언어

2. 고급언어

3. 비절차어

4. 함수언어, 논리언어

5. 비주얼언어

 

. 고급언어의 종류별 특성

1. 베이직과 비주얼 베이직

2. C언어,C++,비주얼C++

3. 포트란

4. 코볼

5. 파스칼

6. HTML

7. 자바

. 다른 프로그램의 설계

1. 프로그램의 개요

2. 프로그램 설계 기법

3. 프로그램의 구조

. 프로그래밍의 예

1. 비주얼 프로그래밍 예

2. 객체지향 언어 프로그래밍 예

3. 절차지향 언어 프로그래밍 예

8. 시스템 분석 및 설계

. 개요

 

. 전산화의 배경 및

소프트웨어 수명주기

 

. 예비조사단계

 

. 시스템의 조사분석

1. 시스템 조사

2. 시스템 분석

. 시스템 설계

1. 코드 설계

2. 출력 설계

3. 입력 설계

4. 파일과 데이터베이스의 설계

5. 시스템처리과정의 설계

6. 시스템 통제 설계

7. 예비 대책 및 보고

 

. 시스템 개발

1. 프로그래밍 설명서

2. 프로그램 개발

3. 프로그램의 문서화

. 시스템의 구현 및 운용

1. 새 시스템으로의 교체작업

2. 새 시스템의 운용

9. 파일과 데이터베이스

. 개요

1. 파일

2. 데이터베이스

. 파일구조

1. 순차적 파일구조

2. 상대적 혹은 직접적 파일구조

3. 인덱스된 파일구조

4. 데이터 처리 방식의 비교

. 데이터베이스 관리

시스템

 

. 데이터베이스 시스템의 3계층 스키마 구조

 

. 데이터베이스 시스템의 구성요소

 

. 데이터 모델

 

. 데이터베이 시스템 활용의 특성

 

. 분산 데이터베이스

 

. 데이터베이스의 발전

모델

1. 멀티미디어 데이터베

이스

2. 웹 데이터베이스

3. 공간 데이터베이스

10. 데이터 통신

. 개요

 

. 데이터통신 시스템의 구성 요소

1. 터미널

2. 데이터 전송장치

3. 통신채널

4. 통신제어장치

5. 데이터 통신망에서의

컴퓨터시스템

. 데이터통신 시스템의

처리방식

1. 트랜잭션 처리 방식

2. 시분할 처리 방식

3. 원격일괄 처리 방식

. 데이터통신 속도와 통신량

 

. 회선과 통신로의 구성

1. 회선의 구성

2. 데이터 전송을 위한 통신로 구성

. 데이터통신망 형태

 

. 통신망의 종류

1. 전화망

2. 패킷망

3. 근거리통신망

4. VAN

5. ISDN

6. B-ISDN

7. FDDI

8. ATM

9. 초고속 정보통신망

. 인터넷

1. 인터넷의 역사

2. 도메인

3. 인터넷 번호

4. 식별 주소의 결정

5. TCP/IP

 

. PC통신과 인터넷

1. PC통신의 기능

2. 인터넷의 기능

. 국내PC통신 서비스

1. 새롬 데이터맨98의 이용

2. 새롬 데이터맨98의 초기화면

. 인터넷 항해를 위한 준비

1. 네트워크

2. 인터넷을 위한 준비

. 넷스케이프를 이용한

인터넷 항해

1. 인터넷의 정보검색

11. 개인용 컴퓨터 조립

S/W설치 운영

. 개요

 

. 개인용 컴퓨터 조립

 

. 유의사항과 준비물

 

. 보드 설치 및 CPU,

RAM조립

 

. 케이스에 보드 조립과

전원 연결

 

. EIDE케이블/전원연결

 

. 카드 설치

 

. 오디오/외부 케이블

연결

 

. 최종검사/CMOS설정

 

. FDISK설명서

 

. 운영체제 설치하기

 

1의 보수, 2의 보수, 2진수 뺄셈

1의 보수, 2의 보수, 2진수 뺄셈

2진수: 0과 1로만 이뤄져 있다.

1의 보수: 2진수를 뒤집는다. 다시 말해 0을 1로, 1을 0으로 바꾼다.

2의 보수: 1의 보수에 1을 더한다.

ex) 2진수: 01001

     1의 보수: 10110

     2의 보수: 10111

2진수 뺄셈

“50-30″을 “50+(-30)”으로 바꿀 수 있듯이,

“2진수-2진수”를 “2진수+(2의보수)”로 바꿀 수 있다.

다시 말해 2진수 뺄셈은 2의 보수를 이용해서 덧셈으로 바꿀 수 있다.

단, 제일 앞자리는 부호비트이므로 계산 후 떼어내야 한다.

 

​예) 5 빼기 3 을 2진수로 계산하라.

5-3

(2진수로 바꾸면)=> 101-011

(뒤의 숫자 3을 2의 보수로 바꾸면)=> 101+(101)

(계산하면)=>1010

(제일 앞자리 하나를 떼어내자. 자리올림으로 발생한 숫자는 떼어내야 함)=>010

(10진수로 바꾸면)=> 2

5-3=2 이다.

독학사 1단계 전산개론 주관식 기출문제

독학사 1단계 전산개론 주관식 기출문제

장사꾼들이 하도 많아서 인터넷 이곳저곳을 뒤져 정리했습니다. 틀린 부분에 대해 책임지지 않습니다.

2000년

1. 8비트 체계를 이용하여 10진수 연산인 ’10-13’의 연산을 2의 보수를 사용하여 계산할 경우 2진수값은?

(11111101)2 ( 10 → 00001010 -13 → 11110011 00001010 + 11110011 = 11111101 )

2. 레지스터 크기가 4비트이면 기억주소 공간의 크기는 최대 몇 바이트인가?

24

3. <보기> 의 ㉠, ㉡, ㉢에 들어갈 내용을 쓰시오.
명령어 실행과정에서 제어장치는 주기억장치에서 명령어를 가져와 (㉠)에 넣으면 (㉡)는 이 명령어를 분석하고 해석하게 된다. 그 해석된 결과에 따라 (㉢)는 해석된 명령어의 지시대로 계산을 수행하게 된다.

㉠ 레지스터 , ㉡ 산술논리장치, ㉢ 제어장치

4. 1기가 바이트는 몇 바이트인가?

2의30승 (1byte=8bit, 1KB=2의10승byte, 1MB=2의20승byte, 1GB=2의30승byte, 1TB=2의40승byte)

 

6. 데이터 베이스에 있는 개개의 요소들간의 관계를 표현하는데 사용되는 3가지 논리적 데이터 구조를 쓰시오.

관계형 데이터 모델, 망형 데이터 모델(네트워크형), 계층형 데이터 모델
 

2006년

1. 10진수 61을 8진수와 16진수로 표현하세요.

75(8), 3D(16)

2. 미국, 7bit 로 된 코드는?

ASCII 코드

3. 1byte는 몇개의 bit 로 구성되는가?

8비트

4. CD-ROM의 차세대로 4.3G의 저장공간을 가지는 것은?

DVD

5. 반경 1Km 이내의 거리에 적당한 통신망은?

LAN

6. 원시프로그램을 컴파일을 통해 기계어로 만들어진 프로그램을 무엇이라 하는가?

목적프로그램

7. CPU의 사용 시간을 일정한 간격으로 분할하여 각각 별도의 프로그램을 할당하여 처리하는 방식을 무엇이라 하는가?

시분할처리방식(TDM)
 

2008년

1. 7비트 코드, 16비트 코드 이름

ASCII코드(7비트) / 유니코드(16비트)

2. 논리레코드를 물리레코드로 저장하는 것을 무엇이라고 하는가?

3. 스키마의 3가지 개념

6. (     ) 란 객체를 정의하고 ~~~~ 추상적개념이다.

7. 47을 2진법, 16진법으로 고쳐라.

2009년 

1. 컴퓨터 장치 – 입력, 연산

2. 운영체제

3. 클래스, 상속

4. 인터프리터

5. 인터럽트

6. 데이터베이스에 관한 내용 – 논리적, 물리적

7. 컴퓨터 통신망 종류 – VAN

***CPU 기능 – ALU

***OMR, OCR – OBDC

***WAP, 블루투스

***성형네트워크

***스타트비트, 스톱비트 – 비동기전송

***데이터베이스 종류 table – 관계형 데이터베이스

***HTML – XML

***전이중방식 (full duplex)

***DNS 서버

2010년 

1. 진공관을 이용한 최초의 컴퓨터는? ENIAC

2. 컴퓨터에서 처리하는 기본 단위를 무엇이라 하는가? bit

3. 컴퓨터가 바로 인식할 수 있는 언어 (기계어) 와 1대1로 대응되는 저급언어로 여러 기호로 된 언어는?(어셈블리어)

4. DBMS에서 파일의 생성, 삭제 등을 할 수 있는 언어는? SQL

5. 1대1로 회선을 연결 후 데이터를 전송하는 방식은? 회선교환방식

6. 전송할 데이터를 모아서 하나로 만든 다음 전송 후 다시 원래데로 나누는 전송방식은? 패킷 또는 패킷전송방식

7. IP를 이용하여 Voice를 전송하는 전화서비스는(VOIP), 웹상에서 메일, 메세지 등 서비스를 이르는 말은(웹호스팅)

***데이터와 데이터 간의 관계를 나타낸 모델(관계형), tree형 모델(계층형)

***SELECT 구문이 있다면 DML

***11011001(2)를  16진수, 8진수로 바꾸는 문제: D9(16)

***TCP/IP

***사용자와 하드웨어 간의 도와주는 것: 운영체제

***선마이크로 시스템에서 만든 언어: JAVA

***하이퍼 텍스트, HTML

***네트워크 구조 묻는 것: BUS형

2011년

1. 컴파일러, 인터프리터

2. URL 주소를 숫자로 바꿔주는 서비스는 무엇인가요?

3. 00111011(2)를 10진법, 16진법으로 바꾸세요.

2012년

1. 기억장치, 연산장치, 제어장치

2. 2의 40승 / 나노세컨드는 10의 -9승
3. 기억장치에서 쓰기는 안되고 읽기만 됨: ROM / 읽기와 쓰기 다 됨: RAM
4. UNIX

5. IPv4, IPv6 바이트로 쓸 것

4바이트, 16바이트

(IPv4: 현재의 인터넷 주소체계로 32비트
 IPv6: IPv4를 대폭 확장한 차세대 인터넷주소 체계.IP주소공간을 128비트로 확장. IPv4의 4배)

5. ftp

6. 세계표준: 유니코드

7. 속도가 제일 빠른 기억장치: 캐시메모리

***레지스터, 캐시메모리, 주기억장치, 하드디스크. 저장크기 순으로 나열하시오: (작은 것부터 레지스터, 캐시메모리, 주기억장치, 하드디스크)

***비트, 바이트, 워드, 레코드 크기 순 나열

***필드=어트리뷰트=열(컬럼),  레코드=튜플=행(로우)

***폰노이만: 내장프로그램방식

2013년

1. bit, 레코드 (데이터 저장의 최소단위와 길이는?)

2. 제어, 산술논리연산

3. DPI (해상도)

4. 컴파일러, 인터프리터 (한꺼번에 변환, 순차적 변환)

5. 기획, 개발 (과정)

6. LAN, VAN (회사 안 네트워크, 회사끼리 네트워크) cf) Local Area Network / cf2) 인트라넷이라는 오답이 많았음

7. IPV6

***버스형 

***디스크-트랙-섹터 (큰 순서부터)

***스키마 (데이터베이스의 정보)

***관계형

***리피터? 모뎀? (아날로그<->디지털 변환)

***패킷교환 (중간에서 교환)

***풀듀플랙스 (양쪽 어쩌고 저쩌고)

***트리형

***tcp (HTTP, FTP 에 해당되는 프로토콜)

기타

1. 2의 보수를 사용하여 11011011-11010의 계산과정과 답을 쓰시오.

2. 어떤 하나의 객체(object)를 정의하고 한 걸음 더 나아가 그 객체에 대한 모든 가능한  행동 양식과 해야 될 일, 해서는 안될 일 등의 규칙을 정해 놓은 추상적인 형태를 가리키는 용어를 쓰시오.

클래스(class)

 

3. 다음이 나타내는 기법은 무엇인지 쓰시오.

시시각적인 표현과 재사용, 상대적으로 코드화하기 쉬운 프로그램을 만드는 개념으로서 Windows 타입의 메뉴, 버튼, 그래픽을 이용하는 객체지향 개념의 프로그래밍 기법을 말한다.

비쥬얼 프로그래밍 기법

우분투에 자바jdk 스프링spring 하둡hadoop 설치

우분투에 자바 스프링 설치

1. VM VirtualBox 설치(Oracle VM VirtualBox 4.3.22)

2. 우분투 가상머신 설치 (ubuntu-14.04.2-desktop-amd64.iso), 한국어, 한글로

3. 장치 – 게스트 확장 설치

장치 – 드래그앤드롭 양방향

4. 윈도우에서 www.oracle.com의 JAVA SE에서 jdk 리눅스 64bit 다운 (jdk-8u31-linux-x64.tar.gz)

5. 윈도우의 jdk파일을 드래그앤드롭해서 리눅스 “다운로드 폴더”에 옮기고 압축 풀기(jdk1.8.0_31 폴더)

6. 터미널에서, “cd 다운로드” -> “sudo mv ./jdk1.8.0_31 /usr/local” 로 폴더 옮기기

7. 터미널에서 “cd /etc” -> “sudo chmod 646 environment” -> “source environment”

8. 터미널에서 “sudo nano environment” -> PATH 가장 뒤쪽에 ……games:” 부분을 ……games:/usr/local/jdk1.8.0_31/bin”으로 수정하고, 바로 아랫줄에 JAVA_HOME=”usr/local/jdk1.8.0_31″ 를 써넣는다.

Ctrl+o 를 누른후 엔터를 쳐서 저장하고, Ctrl+x 를 눌러 터미널로 빠져나온다. 주의할 점은, 마지막으로 터미널 상에서 source environment 를 쳐야 변경사항이 제대로 적용된다.

9. 자바 스프링을 다운받는다. http://spring.io/tools/sts/all에서 리눅스 버전 받기(spring-tool-suite-3.6.3.SR1-e4.4.1-linux-gtk-x86_64.tar.gz)

10. 스프링을 다운로드 폴더 안에 옮긴 후 압축을 푼다. sts-bundle 폴더가 나오면, 뒤의 글자를 지워 sts 로 이름바꾼다.

11. 터미널에서, “cd 다운로드” -> “sudo mv ./sts /usr/local” 로 폴더 옮기기

12. 가상머신을 껐다가 다시 킨 후, 컴퓨터/usr/local/sts 로 실행

13. 최상단 메뉴의 Window -> Preferences -> General -> Keys -> Content Assist -> Binding을 Ctrl+Space 로 바꾸자.

14. hadoop.apache.org -> 메뉴의 Releases -> Download -> Download a release now -> HTTP라는 글자 하단의 http://apache.mirror.cdnetworks.com/hadoop/common/ -> hadoop-1.2.1 폴더 -> hadoop-1.2.1.tar.gz 다운, 압축 풀기

15. 터미널에서, “cd 다운로드” -> “sudo mv ./hadoop-1.2.1 /usr/local” 로 폴더 옮기기

16. 터미널에서 “cd /etc” -> “sudo nano environment” -> PATH 가장 뒤쪽 부분:/usr/local/hadoop-1.2.1/bin”을 추가하고, 바로 아랫줄에 HADOOP_HOME=”/usr/local/hadoop-1.2.1″를 써넣는다.

위와 같이 수정 완료했다면 ctrl+x (닫기) -> y (저장) -> 엔터 로 nano를 빠져나가자. 주의할 점은, 마지막으로 터미널 상에서 source environment 를 쳐야 변경사항이 제대로 적용된다.

17. 다음 하둡 세팅 과정은 http://blog.naver.com/bb_/220285848826 “4. 지에디트로 파일 편집하기”부터 참고

HTML table 표

HTML table 표

 

 

table > tr > td(header일 경우 th)

VirtualBox 우분투ubuntu 하둡hadoop 세팅하기

vmware 우분투ubuntu 하둡hadoop 세팅하기

 

“하둡 다운받기” 포스팅에 이어서 씁니다. 다운받지 못하신 분들은 아래 포스팅을 참조하세요.

http://blog.naver.com/bb_/220285466611

 

우분투 하둡 세팅하기

1. 하둡 압축풀기

다운로드 폴더 안쪽의 hadoop-1.2.1.tar.gz 파일을 압축 풀자. 압축을 푸는 방법은 (1)gz파일을 더블클릭 한 후, (2)압축파일이 열려서 안의 폴더가 보이면, 폴더 위에서 우클릭 -> 압축풀기 로 풀면 된다.

 

 

그러면 위와 같이 hadoop-1.2.1 폴더가 생긴다.

 

 

2. 폴더 옮기기

이제 압축을 푼 하둡 폴더를 “컴퓨터/usr/local” 안쪽으로 옮겨놓자.

 

터미널에서 “cd 다운로드”를 쓰고 엔터치자. 다운로드 폴더로 들어가라는 뜻이다. “sudo mv ./hadoop-1.2.1 /usr/local” 하면 된다. 최고관리자(sudo) 권한으로 현재경로(./) 안의 hadoop-1.2.1 폴더를 /usr/local 경로로 옮긴다(mv)는 뜻이다.


 


3. 패스 잡기(Hadoop Path)

윈도우에서 자바를 쓸 때나, 리눅스에서 자바를 쓸 때나, 리눅스에서 하둡을 깔 때 모두 마찬가지로 패스(Path)를 잡아줘야 한다. 원래대로라면 vi에디터(윈도우에서 메모장에 해당하는 프로그램)을 써야겠으나, 좀 더 사용이 간편한 nano 프로그램을 써보도록 하자.

터미널에서 “cd /etc”로 etc 폴더로 이동한 후, “sudo chmod 646 environment”라고 쓰자. environment 파일에 대한 권한을 646으로 바꿔주는 명령어이다. 주의점은 “source environment”를 써줘야 저장이 된다.

이번엔 터미널에서 “cd /etc”로 etc 폴더로 이동한 후, “sudo nano environment”라고 쓰자. 최고관리자 권한(sudo)하에 nano라는 프로그램으로 environment(파일이름)라는 파일을 열겠다는 뜻이다.

 

 

 

기존의 내용은 아래와 같다.

 

PATH=”/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games”

 

 

여기에 자바를 깔았다면 다음과 같이 내용을 변경하자. 보고 있는 바와 같이 Path에는 콜론(:)을 붙이고 주소를 갖다 붙이면 추가된다.

 

PATH=”/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/jdk1.8.0_31/bin”
JAVA_HOME=”/usr/local/jdk1.8.0_31″

 

 

여기에 하둡까지 깔았다면 다음과 같은 내용으로 바꾸자.

 

PATH=”/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/jdk1.8.0_31/bin:/usr/local/hadoop-1.2.1/bin
JAVA_HOME=”/usr/local/jdk1.8.0_31″

HADOOP_HOME=”/usr/local/hadoop-1.2.1″

 

위와 같이 수정 완료했다면 ctrl+x (닫기) -> y (저장) -> 엔터 로 nano를 빠져나가자.

주의할 점은, 마지막으로 터미널 상에서 source environment 를 쳐야 변경사항이 제대로 저장된다.


 

 

4. 지에디트로 파일 편집하기

 

(1) hadoop-env.sh

local/hadoop-1.2.1/conf 에 들어가서 hadoop-env.sh를 찾는다. 열어서 기존의 “# export JAVA_HOME=/usr/lib/j2sdk1.5-sun” 부분을,

 

export JAVA_HOME=/usr/local/jdk1.8.0_31
export HADOOP_HOME=/usr/local/hadoop-1.2.1
export HADOOP_HOME_WARN_SUPPRESS=1

 

로 바꾸자.

 

(2) core-site.xml

local/hadoop-1.2.1/conf 에 들어가서 core-site.xml를 찾는다. 마우스 우클릭 -> 지에디트로 열기 로 파일을 연다.

아래와 같이 입력하자.



 

(3) hdfs-site.xml

local/hadoop-1.2.1/conf 에 들어가서 hdfs-site.xml를 찾는다. 마우스 우클릭 -> 지에디트로 열기 로 파일을 연다.

아래와 같이 입력하자.

 

(4) mapred-site.xml

local/hadoop-1.2.1/conf 에 들어가서 mapred-site.xml을 찾는다. 마우스 우클릭 -> 지에디트로 열기 로 파일을 연다.

아래와 같이 입력하자.

 

 

 

5. 하둡 초기화

터미널을 열어, “cd /usr/local/hadoop-1.2.1/bin“을 통해 폴더를 이동한다. 해당 경로 안에 hadoop 실행 파일이 있기 때문이다.

이어서 “./ hadoop namenode -format“을 통해 하둡을 초기화한다.

 

질문과 함께 (Y or N)가 뜬다면 대문자 Y를 입력하자.

 

 

 

6. 하둡 실행

cd /usr/local/hadoop-1.2.1/bin”을 통해 폴더를 이동한다(이미 해당 경로에 위치하고 있다면 생략해도 된다).

이어서 “./ start-all.sh“을 통해 하둡을 실행할 수 있다.

 

7. jps 확인

터미널에서 jps 라고 썼을 때, 세 가지가 확인되어야 한다. namenode, TobTracker, Jps 세 개가 다 떠야한다. 그렇지 않고 2개 이하가 뜬다면 거쳐온 세팅을 되짚어봐야 한다.





8. 연결 확인

마지막으로 파이어폭스를 켜서 두 군데에 연결 확인을 해보자.

http://localhost:50030/jobtracker.jsp , http://localhost:50070/dfshealth.jsp 이렇게 두 군데에 접속 시도하면 연결이 되어야 한다.

만약 Unable to connect 가 나오면, 중간 과정을 다시 되짚어봐야 한다.

 

 

jsp 다이나믹 웹 프로젝트 tomcat톰캣 연동하기

jsp 다이나믹 웹 프로젝트 tomcat톰캣 연동하기

 

1. 우선 톰캣을 다운받자.

“아파치 톰캣”을 검색해서 사이트에 들어간다.

왼쪽 메뉴의 “Tomcat 8.0″을 선택하고, “64-bit Windows zip”을 받는다. 기억하기 좋은 위치에 압축을 푼다.

 

2. JAVA EE에서 File -> New -> Dinamic Web Project 로 프로젝트를 만든다. 

2-1. WebContent 밑에는 패키지 대신 원하는 이름으로 폴더를 만든다. 여기서는 test 라는 폴더를 만들었다.

2-2. WEB-INF 의 하위폴더 lib 안에 servlet-api.jar 를 붙여넣는다. 톰캣경로\lib 에서 파일을 복사해오면 된다.

 

 

3. 마우스 우클릭-> Run-> Run On Server로 실행하되, 서버타입에서 “Tomcat v8.0 Server”를 선택한다.

“Next”를 누른다.

 

4. 브라우즈(Browse)에서 아파치 톰캣의 경로를 지정해준다.

 

5. 코딩한 소스가 웹페이지 모양으로 정상 실행될 것이다.

리눅스 우분투ubuntu 명령어

리눅스 우분투ubuntu 명령어

ctrl shift + : 터미널창 확대

ctrl – : 터미널창 축소

 

 

cd /a        a라는 이름의 폴더로 이동
cd            상위폴더로 이동
cd ..         상위상위폴더로 이동
cd /         루트로 이동
pwd         현재위치

VirtualBox ubuntu 우분투 설치하기

VirtualBox ubuntu 우분투 설치하기

1. 버추얼박스 다운로드/설치

https://www.virtualbox.org/ 접속 -> downloads -> VirtualBox 4.3.22 for Windows hosts  x86/amd64  다운

바탕화면에 다운받은 후 실행해서 next, next…하며 설치하자.

2. 우분투 다운
http://www.ubuntu.com/download/desktop

14.04.2 LTS 버전 64bit 다운로드하자.

이때 기부액을 적게 되는데, 모두 0$로 맞춰놓고 다운받아야 공짜다.

3. 가상머신 생성
버추얼박스 실행해서,
1. 새로 만들기(N) 클릭
2. 이름:aa(혹은 다른 이름 아무거나) / 종류:Linux / 버전:Ubuntu(64bit), 다음
3. 메모리크기 1500 MB, 다음
4. 지금 가상 하드 드라이브 만들기(C), 만들기
5. VDI(VirtualBox 디스크 이미지), 다음
6. 동적 할당(D)
7. 새 가상 하드 드라이브 크기를 20.00 GB 로 설정, 만들기

4. 가상머신 구동

aaa를 선택한 상태에서 시작(T)하면 아래와 같이 “가상 광학 디스크를 선택하라”고 나온다.

아까 받아둔 ubuntu-14.04.2-desktop-amd64.iso 를 선택하자.

5. 우분투 설치

우분투 설치화면이 나오면 next, next를 누르며 설치하면 된다.

단, 언어 선택을 하는 부분이 두 군데 나오는데 한국어로 해주자. 언어선택은 가장 처음에 한 번, 중간에 한 번 더 나온다.

6. 우분투 한영전환

Ctrl키+Space바 혹은 윈도우키+Space바를 누르면 한영 전환이 된다. 그러나 한글이 안되는 경우가 있다. 아래와 같은 상태는 한글이 안되는 상태이다.

Korean, hangul 은 실질적으로 한글이 나오지 않는다. 이 경우 아래처럼 언어지원을 찾아 실행하자. language로 검색해도 나온다.

언어지원에서 [언어 설치/제거]-[한국어]를 체크하고 [바뀐 내용 적용]을 클릭한다.

재부팅한다. 재부팅해서 보면 우측상단 언어탭에 “한국어”가 등장했을 것이다. 이제 한국어를 고르고 Ctrl키+Space바 혹은 윈도우키+Space바를 누르면 한영 전환이 된다.

7. 해상도 조절

해상도 때문에 각종 버튼이 보이지 않고 애로사항이 꽃핀다면 아래 포스트를 참고하자.

http://blog.naver.com/bb_/220284421295

VirtualBox ubuntu 우분투 해상도 크게하기

VirtualBox ubuntu 우분투 해상도 크게하기

VirtualBox 로 우분투를 깔았을때 640×480 수준으로 해상도가 잡혀있어 불편함을 느끼는 경우가 있다.

방법

VirtualBox 창의 메뉴에서 [장치]-[게스트 확장 설치]를 하면 지가 알아서 스스로 설치된다.

재시작하면 해상도가 크게 바뀌어 있다.

문제해결

문제1. VirtualBox에 메뉴가 안 보이는 경우

아예 상단 메뉴(머신, 보기, 장치, 도움말)가 보이지 않는 경우가 있다. 크기조절 창으로 변경하면 그렇다. 이럴땐 다시 본래의 창으로 돌려줘야한다.

[파일]-[환경설정]에 들어가서, [입력]-[가상머신]-[호스트 키 조합]으로 가서 F2키로 변경한다. 이러면 호스트키가 F2 키가 된다.

이제 우분투를 실행하여 로그인한 후, F2키+C키를 누르면 창이 복원된다.

문제2. ​”강제 마운트 해제” 메시지 

강제 마운트 해제를 하겠냐는 메시지가 뜨면서 자동으로 설치가 안되는 경우가 있다. 이 경우 CD 마운트가 충돌했기 때문이다.

이 경우 내 폴더-VBOXADDION 에서 마우스 오른쪽 키해서 “빼기(Eject)”해준다.

그 다음 다시, VirtualBox 창의 메뉴에서 [장치]-[게스트 확장 설치]를 하면 지가 알아서 스스로 설치된다.

txt파일 읽고, 쓰고, 수정하기

txt파일 읽고, 쓰고, 수정하기

import java.io.*;//파일 읽으려면.
import javax.swing.*;//메시지 주려면

class Sawon{
 int sabun;
 String name;
 String job;
 String loc;//근무지
 String hiredata; //static을 걸지 않았으므로 각각 저장 가능
}

public class MainClass {
 static Sawon[] sawonRead() throws Exception{//파일 읽을 때는 예외처리 반드시 해야함.
            //”익셉션”이란 코드적으로 수정 가능한 에러를 대비할때 씀.
            //메모리 부족한 경우는 아님
  
  //파일 읽기
  FileReader fr=new FileReader(new File(“c:\\javaDev\\sawon.csv”));
   //인풋스트림은 한글이 깨져버림. 인풋스트림은 8비트씩 가져옴.
   //파일리더는 16비트씩 가져오므로 괜찮음.
  
  String data=””;
  int i=0;
  while((i=fr.read())!=-1){//파일을 EOF까지 읽어옴
   data+=(char)i;
  }
  //System.out.println(data);
  //개행문자별로 나눠서 data에 넣기
  String[] sawonData=data.split(“\n”);
  
  //줄수만큼 사원 클래스 만들기
  Sawon[] sa=new Sawon[sawonData.length];
  //클래스는 생성하자마자 어떤 모습일까?
  //sa={null,null,null} 와 같은 모습이다.
  //int[] a=new int[3] a={0,0,0} 이 되듯이.
  
  for(i=0;i<sa.length;i++){
   sa[i]=new Sawon();//메모리 할당. 공간이 만들어진 상태. C의 malloc과 같음
   String[] ss=sawonData[i].split(“,”);//for문 나가면 사라짐. 임시.
   sa[i].sabun=Integer.parseInt(ss[0]);//숫자로 변환
   sa[i].name=ss[1];
   sa[i].job=ss[2];
   sa[i].loc=ss[3];
   sa[i].hiredata=ss[4];
  }
  
  /*for(i=0;i<sa.length;i++){
   System.out.println(sa[i].sabun+” “
               +sa[i].name+” “
               +sa[i].job+” “
               +sa[i].loc+” “
               +sa[i].hiredata);
  }*/
  return sa;
 }
 
 static void sawonWrite() throws Exception{
  Sawon[] sa=sawonRead();
  String[] temp={“이름”,”직위”,”근무지”,”입사일자”};
  int sabun=0;
  /*for(int i=0;i<sa.length;i++){
   if(sabun<sa[i].sabun)
    sabun=sa[i].sabun;
  }
  sabun++;*/

//자동 증가번호 만들기: 시퀀스
  
  
  
  String res=””;
  for(int i=0;i<temp.length;i++){
   String ss=JOptionPane.showInputDialog(temp[i]+” 입력:”);
   res += ss+”,”;
  }
  
  String data=sabun+”,”+res.substring(0,res.lastIndexOf(“,”))+”\n”;//맨 마지막 콤마 제거
  
  //파일 쓰기
  File file=new File(“c:\\javaDev\\sawon.csv”);
  FileWriter fw=new FileWriter(file,true);
  //FileWriter fw=new FileWriter(file);하면 덮어쓰기가 되고
  //FileWriter fw=new FileWriter(file,true);하면 어펜드(붙여서 계속추가)가 된다.
  
  fw.write(data);
  fw.close();
  JOptionPane.showMessageDialog(null, “사원 등록 완료”);
 }
 
 static void sawonFind() throws Exception{
  Sawon[] sa=sawonRead();
  String name=JOptionPane.showInputDialog(“이름 입력:”);
  String res=””;
  for(int i=0;i<sa.length;i++){
   if(name.equals(sa[i].name)){
    res+=”사번:”+sa[i].sabun+”\n”
     +”이름:”+sa[i].name+”\n”
     +”직위:”+sa[i].job+”\n”
     +”근무지:”+sa[i].loc+”\n”
     +”입사일자:”+sa[i].hiredata+”\n”;
   }
  }
  JOptionPane.showMessageDialog(null, res);
 }
 
 public static void main(String[] args) throws Exception{
  // TODO Auto-generated method stub
  //sawonRead();
  //sawonFind();
  sawonWrite();
 }
 

좌우대칭 문장인지?

import javax.swing.JOptionPane;

public class 좌우대칭문자 {

 static String pInput(){
  //인풋
  String str=JOptionPane.showInputDialog(“대칭확인할 글자를 입력하세요”);
  str=str.trim();
  return str;
 }
 
 static boolean pCompare(String str){
  //문자열 비교
  
  if(str.length()%2!=0){
   //문자열이 짝수가 아니면 종료
   return false;
  }
  
  for(int i=0;i<str.length()/2;i++){
   //AAABBB
   //0    5
   // 1  4
   //  23
   if(str.charAt(i)!=str.charAt(str.length()-i-1)){
    //비대칭이 드러날 경우
    return false;
   }
  }
  
  //그렇지 않으면 대칭.
  return true;
 }
 
 static void process(){
 //전체 프로세스
  String str=pInput();
  boolean bCheck=pCompare(str);
  
  if(bCheck==true){
   JOptionPane.showMessageDialog(null, “대칭이다!”);
  }
  else{
   JOptionPane.showMessageDialog(null, “대칭이 아니다!”);
  }
 }
 
 
 public static void main(String[] args) {
  process();
 }

}
 

csv파일 불러오기, 개행문자로 나누고, 쉼표로 나누기

import java.io.File;
import java.io.FileReader;

public class csv불러오기 {

 static String flInput(String urlurl)
 throws Exception{
  //파일 불러오기
  FileReader fis=new FileReader(new File(urlurl));
  
  String str=””;
  int a=0;
  
  //한자씩 읽어들여서, allStr 변수에 몽땅 넣기
  while((a=fis.read()) != -1){ //EOF 까지 파일 읽어서 변수에 넣기
   //System.out.println(i +” “+(char)i);
   str += (char)a;
  } 
  return str;
 }
 
 static String[] devideN(String str){
  //개행을 기준으로 나눈다
  String[] str2 = str.split(“\n”);
  for(int i=0;i<str2.length;i++){
   str2[i]=str2[i].replace(“\r”, “”);
  }
  return str2;
 }
 
 static void devideS(String[] str){
  //쉼표를 기준으로 나눈다
  for(int i=0;i<str.length;i++){
   String[] data=str[i].split(“,”);
   flOutput(data);
  }
 }
 
 static void flOutput(String[] data){
  //출력한다
  for(int i=0;i<data.length;i++){
   System.out.print(data[i]+”//”); 
  }
  System.out.println();
  System.out.println(“===============================”);
 }
 
 static void process()
 throws Exception{
  //파일을 읽어들여 allStr변수에 몽땅 넣는다.
  String allStr=flInput(“c:\\Users\\user\\Desktop\\sawon.csv”);
    
  //개행을 기준으로 나눠, 배열에 넣는다.
  String[] oneStr=devideN(allStr);
    
  //쉼표를 기준으로 나누고, 출력한다.
  devideS(oneStr);
 }
 
 public static void main(String[] args)
 throws Exception{
  process();

 }
}
 

중복없는 난수

public class 중복없는난수 {

 public static void main(String[] args) {
  
  //난수 10개 만들기
  int arr[]=new int[10];

   for(int i=0;i<arr.length;i++){
   System.out.println(“시작” + i);
    arr[i] = (int)(Math.random()*10)+1;//1~10난수만들기
     for(int j=0;j<i;j++){
      if(arr[i]==arr[j]){ //앞쪽에 같은게 있으면
         i–;    //다시 난수발생
         System.out.println(“컨티뉴”);
         continue;
      }
     }
   }

   
  //난수 10개 출력해보기
  for(int i=0;i<arr.length;i++){
   System.out.print(arr[i]+” “);
  }
  
  
 }
}

[JAVA] 자바 선택정렬, 자바 버블정렬

[JAVA] 자바 선택정렬, 자바 버블정렬

자바 선택정렬

public class 연습_선택정렬 {

    public static void main(String[] args) {

        // int[] aa = {30, 20, 40, 50, 10};

        // 난수발생

        int[] aa = new int[5];
        for (int i = 0; i < aa.length; i++) {
            aa[i] = (int) (Math.random() * 100) + 1;
        }

        // 정렬 전 출력
        System.out.print(“정렬 전 : “);
        for (int i = 0; i < aa.length; i++) {
            System.out.print(aa[i] + ” “);
        }
        System.out.println();

        // 선택정렬
        for (int i = 0; i < aa.length; i++) {
            for (int j = i + 1; j < aa.length; j++) {
                // if (aa[i] < aa[j]) { // 내림차순
                if (aa[i] > aa[j]) { // 오름차순
                    int temp = aa[i];
                    aa[i] = aa[j];
                    aa[j] = temp;
                }
            }
        }

        // 정렬 후 출력
        System.out.print(“정렬 후 : “);
        for (int i = 0; i < aa.length; i++) {
            System.out.print(aa[i] + ” “);
        }
    }

}

자바 버블정렬

public class 연습_버블정렬 {

    public static void main(String[] args) {
        // int[] aa = {30, 20, 40, 50, 10};
        

        // 난수발생
        int[] aa = new int[5];
        for (int i = 0; i < aa.length; i++) {
            aa[i] = (int) (Math.random() * 100) + 1;
        }

        // 정렬 전 출력
        System.out.print(“정렬 전 : “);
        for (int i = 0; i < aa.length; i++) {
            System.out.print(aa[i] + ” “);
        }
        System.out.println();

        // 버블정렬

        for (int i = 0; i < aa.length – 1; i++) {
            for (int j = 0; j < aa.length – 1 – i; j++) {
                // if (aa[j] < aa[j + 1]) { // 내림차순
                if (aa[j] > aa[j + 1]) { // 오름차순
                    int temp = aa[j];
                    aa[j] = aa[j + 1];
                    aa[j + 1] = temp;
                }
            }
        }
       
        // 정렬 후 출력
        System.out.print(“정렬 후 : “);
        for (int i = 0; i < aa.length; i++) {
            System.out.print(aa[i] + ” “);
        }
        System.out.println();
    }
}

 

자바 별찍기(제어문 for문) 연습

자바 별찍기(제어문 for문) 연습

*
**
***
****

****
***
**
*

   *
  **
 ***
****

****
 ***
  **
   *

A
AB
ABC
ABCD

A
BC
DEF
GHIJ

1###
#2##
##3#
###4

—————————————————————————————————————————————————–

package 배열;

public class 연습_별찍기 {

 public static void main(String[] args) {
  //*
  //**
  //***
  //****
  
  for(int i=1;i<=4;i++){
   for(int j=1;j<=i;j++){
    System.out.print(“*”); 
   }
  System.out.println();
  }
  ///////////////////////////////////////////////////
                                System.out.println();
  ///////////////////////////////////////////////////
  //****
  //***
  //**
  //*
  for(int i=1;i<=4;i++){
   for(int j=1;j<=5-i;j++){
    System.out.print(“*”); 
   }
  System.out.println();
  }
  
  ///////////////////////////////////////////////////
                                System.out.println();
  /////////////////////////////////////////////////// 
  //   *
  //  **
  // ***
     //****
  for(int i=1;i<=4;i++){
   for(int j=1;j<=4-i;j++){
    System.out.print(” “);
   }
   for(int j=1;j<=i;j++){
    System.out.print(“*”);
   }
  System.out.println();
  }
  
  ///////////////////////////////////////////////////
         System.out.println();
  /////////////////////////////////////////////////// 
  //****
  // ***
  //  **
  //   *
  for(int i=1;i<=4;i++){
   for(int j=1;j<=i-1;j++){
    System.out.print(” “);
   }
   for(int j=1;j<=5-i;j++){
    System.out.print(“*”);
   }
  System.out.println();
  }
  ///////////////////////////////////////////////////
         System.out.println();
  /////////////////////////////////////////////////// 
  //A
  //AB
  //ABC
  //ABCD
  char a=’A’;
  for(int i=1;i<=4;i++){
   a = ‘A’;
   for(int j=1;j<=i;j++){
   System.out.print(a++);
   }
  System.out.println();
  }
  ///////////////////////////////////////////////////
         System.out.println();
  /////////////////////////////////////////////////// 
  //A
  //BC
  //DEF
  //GHIJ
  a=’A’;
  for(int i=1;i<=4;i++){
   for(int j=1;j<=i;j++){
   System.out.print(a++);
   }
  System.out.println();
  }
  ///////////////////////////////////////////////////
         System.out.println();
  /////////////////////////////////////////////////// 
  //1###
  //#2##
  //##3#
  //###4
  for(int i=1;i<=4;i++){
   for(int j=1;j<=4;j++){
    if(i==j)
    System.out.print(i);
    else
    System.out.print(“#”);
   }
  System.out.println();
  }
         
 }//메인
}//클래스
 

자바 달력

자바 달력

import java.util.Scanner;

public class 연습_달력 {

 public static void main(String[] args) {

  //날짜를 입력할 경우, 요일 출력하기
  Scanner scan = new Scanner(System.in); //글자를 입력받을 스캐너를 선언
  System.out.println(“년도를 입력하세요.”);
  int year = scan.nextInt();
  
  System.out.println(“월을 입력하세요.”);
  int month = scan.nextInt();
  
  System.out.println(“일을 입력하세요.”);
  int day = scan.nextInt();
  
  
  char[] yoil = {‘일’,’월’,’화’,’수’,’목’,’금’,’토’};
  int[] month_day = {31,28,31,30,31,30,
         31,31,30,31,30,31};
  
  if((year%4==0 && year%100==0) || year%400==0){
   month_day[1] = 29; //올해가 윤년일 경우 29일로 고치기
  }
  ///////////////////////////////////////////////
  //작년까지의 일수를 모두 더함(년->일수로 변환)
  int lastYear = (year-1)*365 + (year-1)/4 -(year-1)/100 +(year-1)/400;
  
  int lastMonth=0;
  //저번달까지의 일수를 모두 더함(월->일수로 변환)
  for(int i=0; i<month-1; i++){
   lastMonth += month_day[i];
  }
  
  //오늘까지의 일수를 모두 계산하기
  int total = lastYear + lastMonth + day;
  System.out.println(lastYear);
  System.out.println(lastMonth);
  System.out.println(day);
  
  char todayYoil = yoil[total%7];
  
  System.out.println(year+”년 “+month+”월 “+day+”일은 ” + todayYoil + “요일입니다.”);
  
 }

}

==================================================================================================================

import java.util.Scanner;

public class 연습_달력2 {

 public static void main(String[] args) {
  //년도와 월을 입력하면 달력 출력하기
  Scanner scan = new Scanner(System.in);
  
  System.out.println(“년도를 입력하세요.”);
  int year = scan.nextInt();
  
  System.out.println(“월을 입력하세요.”);
  int month = scan.nextInt();
  
  //전년도까지의 일수 전부 계산하기
  int yearday = (year-1)*365 + (year-1)/4 -(year-1)/100 +(year-1)/400;
  
  //전월까지의 일수 전부계산하기
  int[] mthday = {31,28,31,30,31,30,
      31,31,30,31,30,31};
  
  if((year%4==0 && year%100==0) || year%400==0){
   mthday[1] = 29; //올해가 윤년일경우 2월을 29일로 고치기
  }
   
  int monthday=0;
  for(int i=0; i<month-1; i++){
   monthday += mthday[i];
  }
  
  
  int dayone = yearday + monthday + 1;
  
  //n월 1일의 요일 구하기
  char[] yoil = {‘일’,’월’,’화’,’수’,’목’,’금’,’토’};
  int dayoneyoil = dayone%7;
  
  System.out.println(“일\t월\t화\t수\t목\t금\t토”);
  for(int i=0;i<dayoneyoil;i++){
   System.out.printf(“*”+”\t”);
  }
  for(int i=1;i<=mthday[month-1];i++){
   System.out.printf(“%2d”+”\t”,i);
   if((dayoneyoil+i)%7==0){
    System.out.println();
   }
  }

 }//메인
}//클래스
 

포토샵 연필스케치 효과만들기

포토샵 연필스케치 효과만들기 

 

1. 칼라이미지를 흑백으로 전환
2. 레이어 복제
3. 위쪽 레이어 반전(Invert)
4. 위쪽 레이어 가우시안 블러(심하게)
5. 레이어 모드 표준에서 색상 닷지(Color dodge)로
6. 레이어 합치기
7. 레벨 조정(진하게 만들면 된다)

 

여기까지만 해도 무방.

 

8. 다시, 레이어 복제
9. Add Noise : 가우시안 옵션선택, 모노크로닉 체크박스 체킹
10. 모션블러
11. Opacity(불투명도) 값 조절 후
12. 레이어 합치기 하면 끝. 

엑셀VBA 오토마우스 만들기

엑셀VBA 오토마우스 만들기

 

좀 번거롭긴 하지만 엑셀VBA로도 오토마우스를 만들 수 있다. 그렇다고 서든어택같은 게임에서 쓰일 법한 오토마우스를 만들 수 있는건 아니고… 혹시 그런 의도였다면 조용히 ‘뒤로’를 클릭하시기 바란다.

 

회사 업무적으로 (1)특정한 프로그램을 반복적으로 사용하는데 (2)엑셀 스프레드 시트의 값을 옮겨적고 있는 (3)매우 지루하고 따분하고 반복적인 업무 중이다. 라는 상황에서 이 포스팅이 도움이 될 것이다.

 

따로 이렇게 페이지를 만드는 이유는 기존의 VB에서의 방식으로는 VBA에서 좀처럼 작동하지 않기 때문이다.

 

키입력을 예로 들면 기본적으로 VB에서는 sendkeys를 사용하여 키보드를 조작하게 되는데 VBA에서는 잘 안먹힌다. 게다가 엑셀을 기반으로 하고 있기 때문에 엑셀을 포커스에 두고 알트탭을 무지 눌러야하는 등 번거로운 점이 많다.

 

이 모든 단점을 무마할 강력한 장점이 있다면 역시나 엑셀 스프레드시트가 연동되어 있다는것. 필자는 이제 회사에서 버튼 한 번 클릭으로 향락을 즐기고 있다. 컴퓨터가 알아서 마우스 움직이고, 키보드 치고… 그러하다.

 

1. 각종 선언들

‘마우스 클릭을 위한 선언하기
Private Declare Sub mouse_event Lib “user32” (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)

 

‘마우스 좌표 가져오기를 위한 선언하기
Private Type POINTAPI
x As Long: y As Long
End Type
Dim a As POINTAPI
Private Declare Function GetCursorPos Lib “user32” (IpPoint As POINTAPI) As Long

 

‘마우스 위치설정을 위한 선언하기
Private Declare Function SetCursorPos Lib “user32” (ByVal x As Long, ByVal y As Long) As Long
Const MOUSEEVENTF_LEFTDOWN = 2
Const MOUSEEVENTF_LEFTUP = 4

Const MOUSEEVENTF_RIGHTDOWN = 8
Const MOUSEEVENTF_RIGHTUP = 10

Const MOUSEEVENTF_MIDDLEDOWN = 20
Const MOUSEEVENTF_MIDDLEUP = 40

 

‘키보드 상태확인을 위한 선언하기
Private Declare Function GetAsyncKeyState Lib “user32” (ByVal vKey As Long) As Integer

 

‘키입력을 위한 선언하기
Const KEYEVENTF_EXTENDKEY = &H1
Const KEYEVENTF_KEYUP = &H2
Private Declare Sub keybd_event Lib “user32.dll” (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

 

‘시간지연(슬립)을 위한 선언하기
Public Declare Sub Sleep Lib “kernel32.dll” (ByVal dwMilliseconds As Long)

윈도우 10 컴퓨터, 64비트 컴퓨터에서는 Private Declare Sub 텍스트가 빨간색으로 표시될 것이다.

아래와 같이 선언한다.

‘마우스 클릭을 위한 선언하기
Private Declare PtrSafe Sub mouse_event Lib “user32” (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)

‘마우스 좌표 가져오기를 위한 선언하기
Private Type POINTAPI
x As Long: y As Long
End Type
Dim a As POINTAPI
Private Declare PtrSafe Function GetCursorPos Lib “user32” (IpPoint As POINTAPI) As Long

‘마우스 위치설정을 위한 선언하기
Private Declare PtrSafe Function SetCursorPos Lib “user32” (ByVal x As Long, ByVal y As Long) As Long
Const MOUSEEVENTF_LEFTDOWN = 2
Const MOUSEEVENTF_LEFTUP = 4

Const MOUSEEVENTF_RIGHTDOWN = 8
Const MOUSEEVENTF_RIGHTUP = 10

Const MOUSEEVENTF_MIDDLEDOWN = 20
Const MOUSEEVENTF_MIDDLEUP = 40

‘키보드 상태확인을 위한 선언하기
Private Declare PtrSafe Function GetAsyncKeyState Lib “user32” (ByVal vKey As Long) As Integer

‘키입력을 위한 선언하기
Const KEYEVENTF_EXTENDKEY = &H1
Const KEYEVENTF_KEYUP = &H2
Private Declare PtrSafe Sub keybd_event Lib “user32.dll” (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

‘시간지연(슬립)을 위한 선언하기
Public Declare PtrSafe Sub Sleep Lib “kernel32.dll” (ByVal dwMilliseconds As Long)

 

2. 마우스 좌표 가져오기

현재 사용자의 마우스 좌표값을 알아낸다.

 

Call GetCursorPos(a)
MsgBox a.x & “,” & a.y

 

3. 마우스 클릭

특정 위치에 마우스를 클릭하게 한다. 2번과 같이 쓰면 된다.

 

Call SetCursorPos(x좌표, y좌표) ‘마우스 위치설정
Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) ‘마우스 눌렀다가
Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) ‘마우스 뗀다

 

4. 키입력

sendkeys는 과감하게 버린다. keybd_event 함수를 쓴다.

예를 들면 엔터키 입력

 

‘엔터키 입력
keybd_event 13, 0, 0, 0
keybd_event 13, 0, KEYEVENTF_KEYUP, 0
‘여기서 13은 enterkey의 아스키값

‘Alt+Tab 입력
keybd_event VK_MENU, 0, 0, 0
keybd_event VK_TAB, 0, 0, 0
keybd_event VK_TAB, 0, KEYEVENTF_KEYUP, 0
keybd_event VK_MENU, 0, KEYEVENTF_KEYUP, 0 

본 키입력에서는 아스키 코드를 쓴다.

<간략한 아스키 코드 일람표>

48 :0, 49: 1
65 :A, 66: B
37 : 좌 방향키, 38 : 상, 39 : 우, 40 : 하
46 : delete
112 : F1, 113 : F2

 

5. VBA 코드에서의 실제적 적용

키보드, 마우스 등을 모두 함수화하면 편리하다.

따라서 본 포스트에서는 함수화된 코드들을 제공한다.

 

5-1. 키입력 함수들

Function AltTab()
‘알트 탭
keybd_event 18, 0, 0, 0 ‘알트
keybd_event 9, 0, 0, 0 ‘탭
keybd_event 9, 0, KEYEVENTF_KEYUP, 0
keybd_event 18, 0, KEYEVENTF_KEYUP, 0
DoEvents
End Function

 

Function Tb() ‘탭
‘탭
keybd_event 9, 0, 0, 0 ‘탭
keybd_event 9, 0, KEYEVENTF_KEYUP, 0
DoEvents
End Function

 

Function CtrlV()
keybd_event 17, 0, 0, 0 ‘컨트롤
keybd_event 86, 0, 0, 0 ‘브이
keybd_event 86, 0, KEYEVENTF_KEYUP, 0
keybd_event 17, 0, KEYEVENTF_KEYUP, 0
DoEvents
End Function

 

Function CtrlC()
keybd_event 17, 0, 0, 0 ‘컨트롤
keybd_event 67, 0, 0, 0 ‘씨
keybd_event 67, 0, KEYEVENTF_KEYUP, 0
keybd_event 17, 0, KEYEVENTF_KEYUP, 0
DoEvents
End Function

 

Function CtrlA()
keybd_event 17, 0, 0, 0 ‘컨트롤
keybd_event 65, 0, 0, 0 ‘에이
keybd_event 65, 0, KEYEVENTF_KEYUP, 0
keybd_event 17, 0, KEYEVENTF_KEYUP, 0
DoEvents
End Function

 

Function Delete()
keybd_event 46, 0, 0, 0 ‘딜리트
keybd_event 46, 0, KEYEVENTF_KEYUP, 0
DoEvents
End Function

 

Function Enter()
keybd_event 13, 0, 0, 0 ‘엔터
keybd_event 13, 0, KEYEVENTF_KEYUP, 0
DoEvents
End Function

 

Function GoRight()
keybd_event 39, 0, 0, 0 ‘우측 방향키
keybd_event 39, 0, KEYEVENTF_KEYUP, 0
DoEvents
End Function

 

Function GoLeft()
keybd_event 37, 0, 0, 0 ‘좌측 방향키
keybd_event 37, 0, KEYEVENTF_KEYUP, 0
DoEvents
End Function

 

Function F2()
keybd_event 113, 0, 0, 0 ‘F2
keybd_event 113, 0, KEYEVENTF_KEYUP, 0
DoEvents
End Function

 

Function ESC()
keybd_event 27, 0, 0, 0 ‘ESC
keybd_event 27, 0, KEYEVENTF_KEYUP, 0
DoEvents
End Function

 

5-2. 마우스 입력 함수들

Function NoRestClick(xx As Integer, yy As Integer)
Call SetCursorPos(xx, yy) ‘마우스 위치설정
DoEvents
Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) ‘마우스 눌렀다가
DoEvents
Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) ‘마우스 뗀다
DoEvents
End Function

 

Function Click(xx As Integer, yy As Integer)
Call Rest

Call SetCursorPos(xx, yy) ‘마우스 위치설정
DoEvents
Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) ‘마우스 눌렀다가
DoEvents
Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) ‘마우스 뗀다
DoEvents
End Function

 

5-3. 시간지연 함수

Call Sleep(100)

 

키입력 이후에 바로 슬립을 붙여서 써줘야 동작이 원활하다. 100 대신 다른 숫자를 넣어도 좋다.

예를 들면

 

Call Delete
Call Sleep(10)

 

이렇게 쓰거나

 

Call NoRestClick(778, 411)
Call Sleep(100)

 

이렇게 쓰면 된다.

 

5-4. REST 함수

임의로 만든 함수인데 알트탭(엑셀로 돌아옴)-메시지박스-알트탭(쓰던 프로그램창으로)을 통해 엑셀 포커싱을 환기해준다. 메시지 박스를 띄우는 함수라고 봐도 된다(예를 들어 당신이 알트탭으로 다른 프로그램을 포커싱하고 있다고 하자. 이 때 msgbox 함수를 그냥 쓰면 안 띄워진다. 반드시 엑셀에 포커스를 맞춘 후 msgbox를 띄우고, 다시 돌아가야 한다)

 

다른 사람들은 어떻게 하는지 모르겠는데, 내 경우에 중간중간 알트탭을 자주해주면 작동이 좀 더 원활하게 되었다. msgbox를 확인해주는게 거슬린다면 그 부분만 주석처리 하면 됨.

 

Function Rest()
Call AltTab ‘알트탭
DoEvents
MsgBox “d”
DoEvents
Call AltTab ‘알트탭
DoEvents
End Function 

 

6. 마치며

모두의 칼퇴근을 이뤄주는 엑셀 매크로를 짜는 그 날까지 힘냅시다.

엑셀VBA 유용한 명령어 모음

엑셀VBA 유용한 명령어 모음 

VBA는 VB랑 미묘하게 달라서 안되는 것들도 있고 명령어들도 다르다.

일단 시트를 기반으로 한 명령어들이 다른데 엑셀이란 강력한 군대가 지원해주니

오히려 원조VB보다 강력하단 느낌이다.

 

좀 느리긴 하지만(그리고 번거로운 과정이 있긴 하지만) 오토마우스, 오토키보드도 만들 수 있다.

덕분에 회사에서 아주 잘 쓰고 있고.

 

가장 불편한 점이라면 폼 내부에서 컨트롤을 배치할 때 배열 적용이 안된단 사실이다.

도저히 이해할 수 없다.

 

1. 엑셀 제목표시줄에 글자 표시

Application.Caption = “”

 

파일이름이 들어가는 제목표시줄 부분에 글자가 표시된다.

 

2. 특정시트로 이동

SHT = “시트이름”

Sheets(SHT).Select

 

3. 특정셀 선택

Range(“A1”).Select

 

4. 특정시트의 값 가져오기

SHT = “시트이름”

Sheets(SHT).Range(“A1”).Value

 

5. A열인지 아닌지 확인

If ActiveCell.Offset(0, 0).Column <> 1 Then

 

6. 현재 셀 기억

줄 기억 => a = ActiveCell.Offset(0, 0).Row

칸 기억 => a = ActiveCell.Offset(0, 0).Column

주소 기억 => b = ActiveCell.Offset(0, 0).Address

 

7. 셀 드래그

a = ActiveCell.Offset(?, ?).Address

b = ActiveCell.Offset(?, ?).Address

Range(a & “:” & b).Select

 

8. 글꼴 조정

Range(“A1:D1”).Select

Selection.Font.Bold = False
Selection.Font.Name = “돋움”
Selection.Font.Size = 11

9. 배경 없음

Range(“A1:D1”).Select

Selection.Interior.Pattern = xlNone
Selection.Interior.TintAndShade = 0
Selection.Interior.PatternTintAndShade = 0 


10. 배경 노란색

Range(“A1:D1”).Select

With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 65535
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With

 

11. 한 줄 아래로

ActiveCell.Offset(1, 0).Select

 

(한 줄 오른쪽은 0, 1)

 

12. 특정글자 변경(Replace)

b = Replace(a, “x”, “*”) ‘x를 *로 바꿈

 

13. 검색

aaaa = “문자열”

On Error Resume Next ‘오류가 나도 다음으로
    Cells.Find(What:=aaaa, After:=ActiveCell, LookIn:=xlFormulas _
    , LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext _
    , MatchCase:=False, MatchByte:=False, SearchFormat:=False).Activate
    If Err <> 0 Then ‘MsgBox “검색된 셀이 없습니다”, 64, “검색 실패”
    Err.Clear
    End If
    On Error GoTo 0

야매강좌 php11강 : 게시판 리스트 출력(종합선물세트)

야매강좌 php11강 : 게시판 리스트 작성(종합선물세트)

 

안녕하세요. 이번 강의 준비가 좀 오래걸렸습니다. 마음 단단히 먹으시기 바랍니다. 생각보다 많은 시간이(하루이틀 넘게) 걸리실 수도 있으니까요. 프로그래밍이라는 게 초보단계에선 그렇게 쉬울 수가 없지만, 나중에는 양도 많아지고 이것저것 복잡해지죠.

 

오늘 제목은 게시판 리스트 출력, 그리고 종합선물세트입니다. 오늘 강의 내용을 요리조리 변형해서 모든 사이트가 만들어지는 거라서요.

 

차근히 전진해보세요. 힘들면 쉬면서 하시고요.

 

(서론 1) PHP를 쓰는 이유

뜬금없이 PHP를 쓰는 이유를 얘기해보고 싶네요. HTML을 쓰면 되는데 왜 PHP를 쓸까요.

쉽게 말해 HTML은 어떤 고정된 페이지라서 유저 개입이 안됩니다. 사이트 운영자가 파일을 만지작거려야 바뀌는거죠.

근데 자유게시판, 블로그, 카페, 페이스북 같은 건 모두 유저 개입이 됩니다. 고정된 게 아니어서 유저들이 이것저것 찔러넣으면 수정이 되죠. 이게 큰 차이점이에요.

 

그러니까 PHP로 3가지 정도를 구현하면 됩니다. (이건 뭐 어디서 들은 것도 아니고 그냥 제 개인적 생각입니다)

하나, 입력. 유저가 뭔가를 입력하고요.

둘, 처리. 그게 DB에 들어가고요.

셋, 출력. DB 내용을 화면에 뿌려주면(나타내주면) 됩니다.

 

(서론 2) 게시판 리스트 출력을 해보자

결국 입력-처리-출력 을 만들자는 거죠. 그런 의미에서 오늘 php파일을 3개 만들겁니다.

입력의 input.php, 처리의 input2.php, 출력의 list.php죠.

 

형태는 게시판으로 합니다.

먼저 사용자가 텍스트박스에 글을 쓰면(input), 그걸 DB에 넣고(input2), DB값을 출력하는거죠(list).

이렇게 한 번 만들고 나면 사실 PHP의 기초를 다 배운겁니다.

모든 사이트는 입력-처리-출력의 기본 원리를 이리저리 바꾼 버젼에 지나지 않을테니까요.

 

서론이 길었네요.

 

(1/3) input.php

 

먼저 글 입력창을 만들어봅시다. 이건 사실 야매강좌 6강과 9강을 합친겁니다. 하지만 기억해내서 만들어보세요~ 라고 하면 당연히 못 만드니까 저랑 같이 다시 해봅시다.

 

▼ 이런 화면을 만들면 됩니다

 

설명> 주석에 대해서 얘기해보죠.

 

주석이란 프로그램 작동에는 전혀 영향을 끼치지 않는 부분을 말합니다. 참고용으로 뭔가 적을 때 주석으로 적으면 됩니다.

HTML 언어에서 주석은 <!– 로 열고 –> 로 닫습니다.

PHP 언어와 자바스크립트 언어에서 주석은 // 뒤에 이것저것 쓰면 됩니다.

그러니까 언어가 바뀔 때마다 주석도 바꿔줘야 합니다.

  

input.php

<!–input.php–>
<!–흑곰보드 글쓰기 창입니다–>

<html>
<head><title> 흑곰보드 글쓰기 화면</title>

<!–헤드열기. 헤드에는 title도 들어가지만 나중에 쓰일 함수(펑션)을 만들어 놓으면 됩니다–>

<script language=”JavaScript”> //그런 의미에서 자바스크립트 시작
function check_input() { //check_input 함수를 만듭니다

//이 함수는 비어있는 텍스트박스가 있으면 메시지를 출력하고,

//그렇지 않을경우(else) 전송하는(submit) 함수입니다


if (document.HGB.name.value == ”)
{alert(‘이름칸이 비었어요’);
document.HGB.name.focus();}

 

else if (document.HGB.passwd.value == ”)
{alert(‘비밀번호칸이 비었어요’);
document.HGB.passwd.focus();}

 

else if (document.HGB.email.value == ”)
{alert(‘메일칸이 비었어요’);
document.HGB.email.focus();}

 

else if (document.HGB.url.value == ”)
{alert(‘사이트칸이 비었어요’);
document.HGB.url.focus();}

 

else if (document.HGB.title.value == ”)
{alert(‘제목칸이 비었어요’);
document.HGB.title.focus();}

 

else if (document.HGB.content.value == ”)
{alert(‘ 내용칸이 비었어요’);
document.HGB.content.focus();}

 

else { document.HGB.submit(); }

} //함수 닫기
</script><!–자바 스크립트 닫기–>

</head><!–헤드 닫기–>


<body>

<!–폼이름은 HGB(흑곰보드), 전송방식 포스트, 연관 파일을 설정해줍니다–>
<center><form name=’HGB’ method=’post’ action=’input2.php’>

<!–표–>
<table width=’600′ border=0>
<!–행1. tr로 줄을 만들고, td로 그 속에 칸을 만듭니다–>
<tr>
<td width=’20%’>이름</td>
<td width=’80%’><input type=’text’ name=’name’ size=’20’></td>
</tr>
<!–행2–>
<tr>
<td width=’20%’>비밀번호</td>
<td width=’80%’><input type=’password’ name=’passwd’ size=’20’></td>
</tr>
<!–행3–>
<tr>
<td width=’20%’>메일</td>
<td width=’80%’><input type=’text’ name=’email’ size=’50’></td>
</tr>
<!–행4–>
<tr>
<td width=’20%’>사이트</td>
<td width=’80%’><input type=’text’ name=’url’ size=’50’></td>
</tr>
<!–행5–>
<tr>
<td width=’20%’>제목</td>
<td width=’80%’><input type=’text’ name=’title’ size=’50’></td>
</tr>
<!–행6–>
<tr>
<td width=’20%’>내용</td>
<td width=’80%’><textarea name=’content’ rows=’10’ cols=’50’></textarea></td><!–textarea는 여러줄이 들어가는 박스를 만듭니다–>
</tr>
<!–행7–>
<tr>
<td colspan=’2′ align=’center’><input type=’button’ value=’글 입력하기’ onclick=”javascript:check_input();”></td><!–글 입력하기 버튼을 클릭하면 check_input 함수가 실행됩니다. head부분에 만들어뒀었죠–>
</tr>
<!–표닫기–>
</table>
<!–폼닫기–>
</form></center>

</body>
</html>

 

 

글을 제대로 입력했다면 버튼을 누르는 즉시 폼(HGB)에 있는 박스 내용들이 전송됩니다.

참고로 홈페이지는 http://a 이런식으로 쓰면 되고, 메일은 a@a 이런식으로 쓰면 됩니다.

 

(2/3) input2.php

이 파일은 DB처리하는 내용을 넣을게요. 이 파일은 전체적으로 php를 썼습니다.

다시 말해 파일의 시작은 <?php, 파일의 끝은 ?>로 끝납니다.

다만 중간중간 html이나 자바스크립트가 들어가는데요. 이럴 땐 echo 함수를 이용해서 html과 자바스크립트를 표현합니다.

 

input2.php

<?php //input2.php. 전체를 php문서로 작성해봤습니다.

//에러 함수—————

//아까처럼 html의 헤드 안에 함수를 만들자. 함수 만들 땐 자바스크립트를 활용하는거다.

//이해가 안된다고? 될 때까지 다시 읽어라.

function error($msg)
{
echo

<html><head><script name=javascript>
window.alert(‘$msg’);
history.go(-1);
</script></head></html>
“;
exit;
}
//————————–

 

//DB 연결
mysql_connect(“localhost”, “root”, “apmsetup”) or die (mysql_error()); //localhost 라는 호스트명에 Id 루트, 비밀번호 apmsetup으로 연결한다
mysql_select_db(“oaphp”); //데이터베이스 중 oaphp라는 테이블을 쓰자

//변수 넘겨받기
$name = $_POST[“name”]; //받아온 name을 $name에 집어넣고
$name = addslashes($name); //addslashes(애드슬래쉬)해준다.

                                           //문자열 사이에 역슬래쉬를 넣는 함수다.
                                           //몇 가지 문자들은 DB에 그냥 올리면 오류가 날 수 있기 때문이다.

                                           //ex) ‘ 는 그대로 DB에 넣으면 오류가 나며 \’ 로 입력해야 한다.
                                           //그냥 (방명록이나 게시판 만들 경우) 변수 넘겨받은 후

                                           //반드시 addslashes로 처리하면 됨.

 

$passwd = $_POST[“passwd”]; //위와 동일. 변수 넘겨받은 후,
$passwd = addslashes($passwd); //addslashes 처리 해준다

 

$email = $_POST[“email”];
$email = addslashes($email);

 

$url = $_POST[“url”];
$url = addslashes($url);

 

$title = $_POST[“title”];
$title = addslashes($title);

 

$content = $_POST[“content”];
$content = addslashes($content);

//초기값 설정
$daytime = time(); //현재 시간을 daytime변수에 넣는다
$ip = getenv(“REMOTE_ADDR”); //사용자의 ip 주소를 가져온다. 이 소스가 정확히 무슨뜻이냐고?

                                              //미안하지만 복사-붙여넣기를 추천한다
$count = 0; //조회수 0으로 설정

//정규 표현식을 이용해서 문자열을 검사
if(!ereg(“([^[:space:]])”, $name)) //if(!ereg(“([^[:space:]])”, $변수)) 가 뭐냐고?

                                                 //$변수가 비었을 경우라는 뜻이다.

                                                 //복잡하니까 복사해다 쓰면 된다
{ error(“이름칸이 비었어요”); //문자열이 문제가 있을 경우 메시지 띄우고
  exit;} //exit한다.

 

if(!ereg(“(^[0-9a-zA-Z]{4,8}$)”, $passwd)) //영문, 숫자만 받는다. 4~8글자
{ error(“비밀번호는 4~8자의 영문 또는 숫자로 써주세요”);
  exit;}

 

if($email != ” && !ereg(“(^[_0-9a-zA-Z-]+(\.[_0-9a-zA-Z-]+)*@[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*$)”, $email)) //이걸 외울생각이라면 말리고 싶다. 중간에 @가 들어가야 한다
{ error(“메일주소를 바르게 써주세요”);
  exit;}

 

if($url != ” && !ereg(“http://([0-9a-zA-Z.\@~?&=_])”, $url)) //http://를 앞에 붙여야 한다
{ error(“사이트 주소를 바르게 써주세요”);
  exit;}

 

if(!ereg(“([^[:space:]])”, $title))
{ error(“제목칸이 비었어요”);
  exit;}

 

if(!ereg(“([^[:space:]])”, $content))
{ error(“내용칸이 비었어요”);
  exit;}

 

//갖고 있는 변수를 데이터베이스에 입력하고 싶다면? 다시 말해 변수->DB 하고 싶다면?
$sql = “insert into board (name, passwd, email, url, title, content) values (‘$name’, ‘$passwd’, ‘$email’, ‘$url’, ‘$title’, ‘$content’)”;

//insert into 테이블이름 (넣을 필드이름) values (넣고싶은값)
//예를 들어 insert into A (aa, bb) values (‘$cc, $dd’); 하면

//테이블 A의 aa 필드에 변수 cc가 들어가고, bb 필드에 변수 dd가 들어간다.

 

//sql로 쿼리요청 또는 실패시 에러
mysql_query($sql) or die (mysql_error());

 

//글 목록 페이지로 이동하기
echo(“
<html><head><script name=javascript>
location.href=’list.php’;
self.window.alert(‘글이 입력되었다!’);
</script></head></html>
“);

//페이지 이동할 때 : location.href=’이동할주소’;

//메시지 띄울 때 : self.window.alert(‘내용’);
?>

 

(3/3) list.php

이제 마지막 한 파일만 남았습니다. 조금 더 집중 해봅시다.

 

▼ 아래 그림을 기억해주세요.

 

list.php

<?php //list.php 파일 산뜻하게 시작!

//에러 함수————
//자바스크립트로 메시지 창 띄우고, 이전 화면으로 간 후 exit로 종료하는 함수

//아까도 만들었으니 자세한 설명을 생략한다
function error($msg)
{
echo “
<html><head>
<script name=javascript>
window.alert(‘$msg’);
history.go(-1);
</script>
</head></html>
“;
exit;
}

//————————–

//db연결
mysql_connect(“localhost”, “root”, “apmsetup”) or die (mysql_error()); //mysql에 연결합니다(아이디 root, 비번 apmsetup). 연결안되면 에러출력
mysql_select_db(“oaphp”); //그중에서도 oaphp라는 db에 접속

 

//여기서부터 엄청 중요! 집중

//초기값 설정
$tablename = “board”; //테이블이름은 board
$page = $_REQUEST[“page”]; //page값을 받아와야 됩니다. list.php$page=2 이런식으로 접속될때
if($page == ”) $page = 1; //페이지 없을 경우 1로 설정


$listnum = 5;  //화면에 나올 게시글 수
$pagenum = 10; //화면에 나올 페이지링크 갯수. 페이지 링크란 게시판 하단에 1, 2, 3, 4 식으로 나와서 클릭하면 해당 페이지로 이동되는 것을 말함
$offset = $listnum*($page-1); //초기넘버 계산 (페이지번호 1, 2, 3, 4.., 시작글번호 0, 10, 20, 30..)

$sql = “select count(*) from $tablename”;

//전설의 셀렉트문. 셀렉트문은 php의 꽃이라 할 수 있다. 알아보자.

//(머리 아프면 읽지 않아도 된다. 자연히 알게되겠지 뭐)

//(1) select * from board; 모든 데이터를 가져온다

//(2) select * from board where name=’흑곰’; 이름이 흑곰인 모든 데이터를 가져온다

//(3) select * from board where no=2; 2번째 게시글을 가져온다

//(4) select no, name, title from board; 데이터 중에서도 번호, 이름, 제목 열만 가져온다

//(5) select no, daytime from board order by daytime; 글 입력 시간으로 오름차순

//(6) select no, count from board order by count desc, no; 카운트로 내림차순 후 넘버로 오름차순. order by ~ 하면 오름차순이고, order by ~ desc하면 내림차순인 것

//(7) select count(*) from board; 전체 게시물의 수를 가져온다

$result = mysql_query($sql) or die (mysql_error());
$row = mysql_fetch_array($result); //mysql_fetch_array : 새로운 줄이 몇번째 줄인지

                                                 //알아내는 함수로 기억하자. 자세한 내용은 다음에 다루겠다.

                                                 //그냥 원래 이런식으로 쓰는거다.

$total_no = $row[0]; //전체 글 수

$total_page = ceil($total_no/$listnum); //페이지번호 계산

                                                       //(참고 : ceil 올림, floor 내림, round 반올림)
$cur_no = $total_no – $listnum*($page-1); //글번호 계산. 계산이 어려우면 그냥 그런가보다~해라

 

//board 테이블에서 목록 가져오기, $offset(초기넘버)에서 $listnum(게시글 수)만큼
$sql = “select * from $tablename order by no desc limit $offset, $listnum “;
$result = mysql_query( $sql ) or die (mysql_error());

 

//유저에게 보이는 페이지 시작————————-
//먼저 맨 윗부분을 완성하자. 번호/이름/제목/조회수/날짜
echo “
<html>
<head><title>글 목록</title></head>
<body>
<center>
게시판

<table width=’600′ border=’0′>
<tr>
 <td width=’10%’ align=’center’>번호</td>
 <td width=’15%’ align=’center’>이름</td>
 <td width=’50%’ align=’center’>제목</td>
 <td width=’10%’ align=’center’>조회수</td>
 <td width=’15%’ align=’center’>날짜</td>
</tr>
“;

 

while($row = mysql_fetch_array($result))
//와일은 반복문이다. 괄호 안에 있는 내용이 충족되는한 반복된다.
//즉 모든 줄을 출력하기 위한 반복문이다.

{
 //이름, 제목, 시간을 받아다가
 $name = $_POST[“name”];
 $row[name] = stripslashes($row[name]);

 $title = $_POST[“title”];
 $row[title] = stripslashes($row[title]);

 $daytime = $_POST[“daytime”];
 $date = date(“Y/m/d”, $row[daytime]); //참고 : date(“Y-m-d h:i:s”,$data[‘reg_date’])

 

//순번, 이름, 제목, 조회수, 날짜 순으로 출력한다
 echo(“
 <tr>
  <td align=’center’>$cur_no</td>
  <td align=’center’>$row[name]</td>
  <td><a href=’content.php?page=$page&no=$row[no]’>$row[title]</a></td>
  <td align=’center’>$row[count]</td>
  <td align=’center’>$date</td>
 </tr>
 “);
 
//순번을 1 조정한다(위에서부터 큰 숫자를 출력하므로)
 $cur_no = $cur_no – 1;
}
//모든 줄을 출력하면 while문 끝
echo “</table>”;

 

//페이지 계산
//페이지 링크를 만들기 위한 계산들이다.
//페이지 링크란, 게시판 아래쪽에 1 2 3 4 … 식으로 위치되어
//클릭하면 해당 페이지로 이동하는 것을 말한다
$total_block = ceil($total_page/$pagenum);
$block = ceil($page/$pagenum);

$first = ($block-1) * $pagenum;
$last = $block * $pagenum;

if($block >= $total_block)
 {
 $last = $total_page;
 }

//페이지링크
//표를 따로 만든다. 헷갈리지 않기 위해 따로 만드는 것이다
echo(“
<table width=’600′ border=’0′>
<tr>
<td align=’center’>
“);

//페이지 링크
for($pagelink = $first + 1; $pagelink <= $last; $pagelink++)
 {
 if($pagelink == $page)
  {
  echo(“$nbsp<font color=’red’>[$pagelink]</font>”);
  }
 else
  {
  echo(“$nbsp<a href=’list.php?page=$pagelink’>[$pagelink]</a>”);
  }
 }

echo(“
</td>
</tr>
</table>
 
<table width=’600′ border=’0′>
<tr>
<td width=’15% align=’center’>&nbsp;</td>
<td width=’70%’ align=’center’>&nbsp;</td>
<td width=’15%’ align=’center’><a href=’input.php?page=$page’>글쓰기</a></td>
</tr>
</table>

</center>
</body>
</html>

“);
?>

 

(마치며)

짝짝짝! 이걸 끝까지 따라하셨다면 대단합니다.

전 예전에 프로그래밍이 어떤 마법같다고 생각했어요. 마법처럼 이렇게 저렇게 해라~하면 되는 줄 알았죠.

하지만 그런건 없습니다.

화면에 나타나는 하나 하나가 여러 줄의 코드인 것이죠. 자동으로 되는건 없어요.

 

오늘 배운 11강은 입력-처리-출력가 나오는 핵심부입니다.

나중에 필요할 거 같은 부분은 복사해서 잘 추려두시기 바랍니다. 수고하셨습니다.