2016년 12월 9일 금요일

[Python] 파일모드로 실행



-확장자는 .py
-vi test.py로 파일을 만들고 내용을 코딩.
-실행 : python 경로
     예) python test.py                    //내가 있는 path에 파일이 있을 경우
          python /home/text/test.py    //아닌 경우

[Python] 설치


윈도우 :
https://www.python.org/downloads/windows/  
에서 다운받는다. 설치경로를 정해주고 다음만 누르므로 어려울 것 없다.

환경변수를 설정하던가 파이썬이 설치된 경로에 가서 pythone키워드를 입력.
나가는 키는 ctrl+z




리눅스 : 
기본적으로 파이썬이 설치되어 있을 것이다. python -V를 입력해 현재 버전을 확인.
나가는 키는 ctrl+d


2016년 12월 7일 수요일

[C language] C 언어 기본 문법_4

10. 메모리 할당 
11. 매크로 선행처리기 
12. 파일 분할과



[10. 메모리 할당]


1. 메모리 구조

-코드 영역 : 코드가 저장되는 메모리 공간. 
-데이터 영역 : 전역변수와 static변수 할당. 프로그램 종료 시까지 남아있게 됨.
-스택 영역 : 지역변수와 매개변수. 함수를 빠져나가면 소멸된다는 특징.
-힙 영역 : 프로그래머가 원하는 시점에 변수를 할당, 소멸하도록 지원하는 영역.



2. 메모리 동적 할당

전역변수와 지역변수로 해결이 되지 않는 상황

//char name[30];
char * userName(void){
char name[30];
gets(name);
return name;
}
int _tmain(int argc, _TCHAR* argv[])
{
char * name1, name2;
name1=userName();
printf("%s\n",name1);
name2=userName();
printf("%s\n",name2);
return 0;
}

함수를 빠져나오면서 userName함수의 name변수 값이 소멸된다.
전역변수로도 main함수의 name1과 name2의 값을 다르게 할 수 없다. 
name1과 name2모두 전역변수 name[30]의 주소값을 가리키기 때문이다. 



3. 힙 영역 메모리 공간 할당과 해제

#include <stdlib.h>
void * malloc(size_t size);       //힙 영역 메모리 할당
void free(void * ptr);             //힙 영역 메모리 해제
-> 성공시 할당된 메모리의 주소 값, 실패 시 NULL

- 위 예제의 해결

userName함수의 return하는 변수만 malloc으로 지정해주면 된다.
char * userName(void){
char * name = (char *)malloc(sizeof(char)*30);
gets(name);
return name;
}



4. calloc 과 realloc


#include <stdlib.h>
void * calloc(size_t elt_count, size_t elt_size);     //개수 , 크기
-> 성공시 할당된 메모리의 주소 값, 실패 시 NULL

malloc(sizeof(int)*10)   == calloc(4,10)   
//같은 크기의 메모리 할당. 대신 'malloc은 쓰레기 값'으로 'calloc은 0'으로 초기화 된다.



#include <stdlib.h>
void * realloc(void * ptr, size_t size);     //
-> 성공시 할당된 메모리의 주소 값, 실패 시 NULL

이미 할당된 메모리 공간 확장시 호출한다.
int * arr (int *)malloc(sizeof(int)*3);
arr = (int *)realloc(sizeof(int)*10);




[11. 매크로와 선행처리기]

-선행처리는 컴파일 이전의 처리이다. 단순 치환 작업만 한다.
  Ex)#define NAME        "홍길동"
      #define AGE           29
      #define PRINT_AR   puts("주소 : 서울\n");
   

1. 매크로 함수

#define MUL(X)      X*X           //매크로 함수
-'가로'를 마구 쳐준다. 위의 예제에서 MUL(5+2)의 결과 값은 49가아니라 17이다.
-두줄에 걸쳐 사용하려면 '/' 이용.
-매크로정의시 먼저 정의된 매크로도 사용가능
-실행 속도가 빠르다.



2. 조건부 컴파일

- #IF 매크로 ~ #ENDIF : 매크로가 참이라면  ~ 실행

Ex)
#define ADD 1
#define MIN 0
int _tmain(int argc, _TCHAR* argv[])
{
int num1,num2;
scanf("%d %d",&num1,&num2);

#if ADD  /*참이라면*/    printf("%d + %d = %d\n",num1,num2,num1+num2);
#endif
#if MIN  /*참이라면*/    printf("%d - %d = %d\n",num1,num2,num1-num2);
#endif
return 0;
}//MIN은 거짓이므로 코드자체가 삭제된다.


- #IFDEF 매크로 ~ #ENDIF : 매크로가 정의되었다면 ~ 실행

- #IFNDEF 매크로 ~ #ENDIF : 매크로가 정의되지 않았다면 ~ 실행

- #ELIF 삽입 : #IF에만 해당
   Ex)
#define ADD   5
int main(void)
{
#if ADD==5
printf("ADD = 5\n");
#elif ADD==6
printf("ADD = 6\n");
#elif ADD==7
printf("ADD = 7\n");
#else 
printf("ADD = 5,6,7이 아니다\n");
#endif
return 0;
}



3. 문자열 내에서 매크로

-문자열은 치환이 안되기에 #연산자를 쓴다.
 Ex)#define STRING_JOB(A,B)    #A "의 직업은 " #B "입니다."

-단순 문자열 결합해서 출력
#define CON(UPP, LOW)    UPP ## 00 ## LOW
int num = CON(22,55);




[12. 파일분할]

파일분할
extern선언 : 외부파일에 변수/함수가 선언되어 있음을 알린다.
static 선언 : static 전역변수는 접근의 범위를 파일의 내부러 제한한다.
                외부파일에서 접근을 허용하지 않는다.




[Python] python을 통한 web crawling_기본 Library 설치


1. 개발환경

-OS  :우분투 14.04 LTS
-Language :python 2.7
-Library : BeautifulSoup, Scrapy



2. 설치

-테스팅 기능을 하는 가상환경 설치.
-beautifulsoup , scrapy 둘 중 하나를 사용하여 crawling하므로 설치.


sudo apt-get update
//패키지 업데이트

sudo apt-get install build-essential
//gcc, 라이브러리 등 개발을 위해 필요한 기본적인 패키지 설치

python
//파이썬을 사용할 수 있는 콘솔창 실행.

python -V
//파이썬 버전확인. 기본적으로 파이썬은 설치되어 있다.

sudo apt-get install python-pip
//pip라는 파이썬 패키지 매니저를 설치. 파이썬에 패키지 다운시 편리하게 다운가능.

sudo pip install virtualenv virtualenvwrapper
//파이썬 환경 가상화(캡슐화) 설치. 현재 가상환경을 다른 환경에 적용 할 때 사용.
  대부분  'virtualenv, virtualenvwrapper' 을 같이 씀.
  본 서버에 적용하기 전에 패키지들 끼리의 호환, 필요한 lib를 정리하는 등 테스트 용도.

vi .bashrc
//profile 설정파일. 가상환경 셋팅을 위해.

fi
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
//vi에서 파일의 맨 밑으로 내려가 코드를 쳐준다.
 첫째 줄은 가상환경 홈디렉토리 지정.
 둘째 줄은 env를 편리하게 사용하기 위해 wrapper명령어 사용을 위함.

source .bashrc
//profile 적용

mkvirtualenv 가상환경이름
//가상환경 만들기. path는 .bashrc 설정된 $HOME~

deactivate
//가상환경 나오기

workon 가상환경이름
//가상환경 사용

(가상환경)sudo apt-get install python-lxml
//파이썬 lxml설치

(가상환경) pip install python-lxml
//파이썬 환경에서 lxml설치

cd .virtualenvs/ 를 보면 내가 설치한 가상환경을 볼 수있다.

(가상환경)sudo apt-get install libxml2-dev libxslt-dev python-dev zlib1g-dev
//beautifulsoup,설치 전에 필요한 패키지. html가져와 분석 등.

(가상환경)pip install beautifulsoup4
//뷰티풀스왑 설치

(가상환경)sudo apt-get install libffi-dev libssl-dev
//scrapy 설치 전 필요 패키지

(가상환경)pip install Scrapy
//scrapy 설치

2016년 12월 6일 화요일

[SQL]명령어 기본

[DDL]
CREATE, ALTER, DROP

-테이블 생성
create table 테이블명 (
필드명 데이터타입 [NOT NULL]
{, 필드명 데이터타입 [NOT NULL]}*
[,PRIMARY KEY (필드명)]   )


-테이블구조 및 속성변경

기존의 테이블구조 변경

1. 필드추가생성
ALTER TABLE 테이블명 ADD [COLUMN] 필드명 필드타입
예) ALTER TABLE userdb ADD COLUMN addr VARCHAR(100)

2. 필드속성변경
ALTER TABLE 테이블명 CHANGE [COLUMN] 기존필드명 새필드명 필드타입
예) ALTER TABLE userdb CHANGE COLUMN addr address VARCHAR(255)

3. 필드삭제
ALTER TABLE 테이블명 DROP [COLUMN] 필드명
예) ALTER TABLE userdb DROP COLUMN address


4. 기존의 테이블삭제
DROP TABLE 테이블명




[DML]
SELECT, INSERT, UPDATE, DELETE


[1. SELECT (데이터검색하기)]

SELECT [DISTINCT] 테이블명 {, 테이블명} * (AS 테이블명)
FROM 필드명 {,필드명} *
[WHERE 검색조건]
[ORDER BY 필드명[ASC or DESC] {,필드명 [ASC or DESC]}*]
[GROUP BY 필드명 {, 필드명}*]
[HAVING  검색조건]


1. 일반적인 검색

SELECT name, id FROM userdb WHERE level = 'B'
SELCET * FROM userdb
SELECT name, id, email, sex, milage, level FROM userdb


2. 결과레코드의 중복제거

SELECT level FROM userdb
SELECT DISTINCT level FROM userdb


3. 조건검색

SELECT name, id, email 
FROM userdb 
WHERE milage > 3000 AND sex = 'M'


4. 검색결과의 정렬

SELECT name, id, milage FROM userdb 
WHERE milage >= 3000 
ORDER BY milage DESC


5. 검색결과에 대한 산술계산 및 문자열처리

SELECT name, '님의 마일리지는 ', milage, '점입니다.' 
FROM userdb WHERE milage >= 3000 
ORDER BY milage

SELECT name, id, email, milage+300 FROM userdb
WHERE id = 'soony'


6. 그룹함수(group function)를 이용한 검색

SELECT count(*) FROM userdb 
WHERE sex = 'F'

SELECT avg(milage) FROM userdb 
WHERE sex='F'


7. GROUP BY를 이용한 검색

SELECT level, max(milage), min(milage), avg(milage) 
FROM userdb GROUP BY level

SELECT sex, max(milage), min(milage), avg(milage) 
FROM userdb GROUP BY sex


8. HAVING을 이용한 검색

SELECT sex, max(milage), min(milage), avg(milage)
FROM userdb
GROUP BY sex
HAVING sex = 'F'


9. BETWEEN 연산자를 이용한 검색

SELECT name, email, mailage, sex
FROM userdb
WHERE sex = 'F' AND milage BETWEEN 3000 AND 4000

SELECT name, email, milage, sex
FROM userdb
WHERE sex = 'F' AND milage >= 3000 AND milage <= 4000

SELECT name, sex, milage
FROM userdb
WHERE milage NOT IN (3300,3500,3700)


10. LIKE를 사용한 검색

SELECT name
FROM userdb
WHERE name, LIKE '%현%'

SELECT name, id,
FROM userdb
WHERE id LIKE 'm%'


11. NULL값을 갖는 데이터검색

SELECT name, id FROM userdb WHERE email IS NULL
SELECT name, id FROM userdb WHERE email IS NOT NULL



[2. INSERT (새로운 데이터의 삽입)]

INSERT INTO 테이블명 [(필드명{[, 필드명]}*)] VALUES (필드값)

INSERT INTO userdb (name, id, email, sex, milage, level)
VALUES ('이완철', 'yunka1018','sspark@kornet.net'.'M','3500','B')

INSERT INTO userdb
VALUES('이완철', 'yunka1018','sspark@kornet.net','M','3500','B')

INSERT INTO userdb (id, name)
VALUES('yunka1018','정양미')



[3. 데이터의 수정(UPDATE)]

UPDATE 테이블명
SET 필드명=필드값 또는 산술식 {, 필드명 = 필드값 또는 산술식}*
[WHERE 검색조건]

UPDATE userdb
SET sex = 'F'
WHERE name = '김현아'

UPDATE userdb
SET sex = 'F'
만일 위와 같이 WHERE절로 검색조건을 명시하지 않은 경우에는 해당테이블내의 모든레코드의 필드값이 설정한값으로 수정되므로 유의해야한다.

UPDATE userdb 
SET milage = milage + 300


[4. DELETE (데이터의 삭제) ]

DELETE FROM 테이블명
[WHERE 검색조건]

DELETE FROM userdb
WHERE id = 'king94'

DELETE FROM userdb
만일 위와 같이 검색조건을 지정하지 않으면 해당테이블내의 모든레코드가 삭제되므로 주의해야한다.



[ MYSQL 데이터베이스의 사용법 ]

1. MYSQL서버의 기동과 종료

이하 디렉토리위치는 /usr/local/mysql/bin이다.
./bin/safe_mysql &


2. MYSQL서버의 종료 및 재기동

safelab.skku.ac.kr.pid파일은 MYSQL의 PID를 저장하고 있다.
kill -9 PID
mysqladmin -u root  -p shutdown
mysqladmin -u root -p reload


3. mysqladmin 사용법

mysqladmin -u root  -p reload
mysqladmin -u root -p create sample
mysqladmin -u root -p drop sample


4. mysql 클라이언트사용법

mysql -u root -pphp99 mysql
mysql -u root -p mysql
mysql>show databases;
mysql>show tables;
mysql>show columns from db;
mysql>desc db;
mysql>use mysql;
mysql>select host, user, password from user;     //mysql db의 user란 테이블이 존재.
mysql>update user set password = password('php99') where user = 'root'; //비번변경
mysql>select host, user, password from user;
mysql>drop database sample;


5. 생성된 데이터베이스의 등록

mysql>insert into db values('%','sample','php','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql>select host, db, user from db;


6. 새로운 사용자(데이터베이스 소유자)등록

mysql>insert into user (host, user, password)
          values('localhost','php','password('php99'));
mysql>select host, user, password from user;


7. 테이블의 생성과 수정 및 삭제

mysql -u root -p sample
mysql>show tables;
mysql>desc userdb;
mysql>alter table userdb change column id varchar(12) NOT NULL;
mysql>desc userdb;
mysql>drop table userdb;
mysql>show tables;


8. *.sql파일로 쉘에서 SQL명령어 실행

mysql -u root -p php99  sample < userdb.sql
mysql -u php -p sample
mysql>show tables;


9. 데이터의 백업과 복구

mysqldump -u [DB사용자명] -p [백업할 데이터베이스명] > [외부로 저장할 파일명]
mysqldump -u php -p sample > sample_backup.sql
cat sample_backup.sql
mysql -u php -p php99 sample < sample_backup.sql



[ MySQL Dump 방법 및 복구 방법 ]

1. dump

전체 덤프
 -  $> mysqldump -u[사용자아이디] -p[패스워드] 데이터베이스명 > 저장될 파일명.sql
 - 예) mysqldump -udis -phmcdis dis > dis_081231.sql
   이렇게 하면 디비(dis)를 전체 덤프를 뜨게된다.
테이블만 덤프
 -  $> mysqldump -u[사용자아이디] -p[패스워드] 데이터베이스명 테이블명 > 저장될 파일명.sql
 - 예) mysqldump -udis -phmcdis dis termininal_info > dis_termininal_info_table.sql


2. 복구하기

  -  $> mysql -u[사용자아이디] -p[패스워드] [디비명] < 덤프파일명
  - 예) mysql -udis -p dis < dis_081231.sql
  - 예) mysql -udis -p dis termininal_info < dis_termininal_info_table.sql


3. 특정 db의 특정 table에서 원하는 값만 덤프받기

 - edu라는 디비에 a,b,c라는 테이블이 있다. 여기서 a라는 테이블에서 no가 7번이상이고 10번 이하인 값만 덤프하기
 - 사용되는 옵션 -w
 - 예) mysqldump -u mysql_admin -p edu a -w'no=>7 and no=<10' > edu_a_cond.sql  : 위와같이 하면 no가 7~10번까지가 덤프될것이다.
c:\>mysqldump -ucheckmate -p***** cfwdata trenddata -w"trendtime>'2009100711'" > d:\trenddata.sql
2. DataBase 스키마(Schema)만 백업받기
 - edu라는 디비의 모든 테이블 스키마를 백업받으려면
 - 예) mysqldump -u mysql_admin -p -d edu > edu_db.sql
 - edu라는 디비의 a라는 테이블 스키마를 백업받으려면
 - 예) mysqldump -u mysql_admin -p -d edu a> edu_a_table.sql

2016년 11월 29일 화요일

Java eclipse 에서 JDBC이용하여 mysql 사용하기

1)개요
JVM   ->  Mysql                       (X)
JVM   ->  JDBC(API)  ->  Mysql   (O)



2)JDBC 설치
http://dev.mysql.com/downloads/connector/j/에 들어가 ZIP파일을 받는다.













다운 받고나면 아래와 같은 파일이 있다. 압축을 풀어주자.
























3)JAVA Library에 추가

아래의 이미지와 같이 JAVA에서 JDBC API사용을 위해 JRE System LIbrary에 'mysql-connectior-java.jar'추가하여야 한다.





우클릭 -> Build Path -> Configure Build path... 에 들어간다.
우측 두번째 버튼 Add External JARs.. 를 눌러 압축 푼 파일을 찾아 넣고 ok를 누른다.
























4)연동 확인

mysql은 설치하시고 cmd에서 mysql/bin 파일로 이동해서 mysql -uroot -p패스워드를 입력 maysql에 들어간다.

1)show databases;                 //데이터베이스 보기

2)CREATE DATABASE test;       //test할 데이터베이스 생성

3)USE test;                           //데이터베이스 사용(test db에 들어감)

4)CREATE TABLE tablename (column_name1 INT,
                                     column_name2 VARCHAR(15),
                                     column_name3 INT );               //테이블 생성

5)INSERT INTO tablename VALUES(111,"hong",12341234);     //테이블에 값 추가

6)SELECT * FROM tablename;     //테이블 안에 있는 값 보기


7)이클립스에서도 연동되는거 확인하려면 아래 코드 실행.

package dbtest;

import java.sql.*;
//import java.sql.Connection;
//import java.sql.DriverManager;
//import java.sql.SQLException;


public class maindb {
public static void main(String[] args) {
try {

Class.forName("com.mysql.jdbc.Driver").newInstance();
} catch (Exception ex) {
// handle the error
}

Connection conn =  null;
try{
conn =
DriverManager.getConnection
                ("jdbc:mysql://localhost:3306/test" ,"root" ,"비밀번호");
System.out.println("connect");
} catch (SQLException ex) {
//handle any errors
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());

}
       
Statement stmt = null;
ResultSet rs = null;
try{
stmt = conn.createStatement();
rs = stmt.executeQuery("select * from tablename");
while(rs.next()){                                                    
String c1 = rs.getString("column_name1");
String c2 = rs.getString("column_name2");
                        String c3 = rs.getString("column_name2");
System.out.println(c1+" "+c2+" "+c3);
        }
} catch(Exception ex) {
// handle the error
}
}
}

mysql test디비의 tablename테이블의 값, "111,  hong , 12341234"이 출력되면 연동이 된 것이다.


2016년 11월 28일 월요일

[Algorithm] Recursion(재귀) : Counting cells in a blob

[Problem]

blob갯수 구하기. 아래 그림은 4개의 blob이 있다.







[Algorithm]






[Thinking]

recursion을 활용하여 선택된 셀 주위의 인접 image pixel을 확인해 카운트한다. 카운트 된 셀은 구분을 하기위해 빨간 셀로 표기한다.











[Result]

메인 함수의 코드이다.

int countCells(int (*grid)[8], int x,int y){  //grid함수 값 전달시 grid[][8]

if(x<0 || x>=8 || y<0 || y>=8)
return 0;
else if(grid[x][y]!=ImageC)
return 0;
else{
grid[x][y]=AlreadyC;
return 1 + countCells(grid,x-1,y+1) + countCells(grid,x,y+1)
                           + countCells(grid,x+1,y+1)+ countCells(grid,x-1,y)
                           + countCells(grid,x+1,y) + countCells(grid,x-1,y-1)
           + countCells(grid,x,y-1) + countCells(grid,x+1,y-1);
                                                                            //남서, 남, 남동
                                                                        //서, 동,
                                                                         //북서, 북, 북동
    }
}

x와 y에 0,0  즉 gird[0][0]의 blob의 크기를 구해보면 다음과 같다.



blob size는 5이고,
count된 blob은 2로 표기되어졋다.









다음은 전체 코드이다.

#include <stdio.h>

int BackgroundC = 0;  //흰 배경 셀
int ImageC = 1;       //파랑 배경 셀
int AlreadyC = 2;     //파랑 배경 셀에 한번 들른 경우 구별하기 위한 셀

int countCells(int (*grid)[8], int x,int y){  //grid함수 값 전달시 grid[][8]

if(x<0 || x>=8 || y<0 || y>=8) //1. 배열의 값을 넘어서는지 검사.
return 0;

else if(grid[x][y]!=ImageC)    //2. 셀이 빈 셀인지 검사.
return 0;

        else{
grid[x][y]=AlreadyC;    //3. 이미지셀일 경우 중복을 막기위해 체크하고
                                                   다시 재귀한다.
return 1 + countCells(grid,x-1,y+1) + countCells(grid,x,y+1)
                           + countCells(grid,x+1,y+1) + countCells(grid,x-1,y)
                           + countCells(grid,x+1,y) + countCells(grid,x-1,y-1)
   + countCells(grid,x,y-1) + countCells(grid,x+1,y-1);
                                                                            //남서, 남, 남동
                                            //서, 동,
                                                    //북서, 북, 북동
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
int grid[8][8]={{1, 0, 0, 0, 0, 0, 0, 1},
   {0, 1, 1, 0, 0, 1, 0, 0},
   {1, 1, 0, 0, 1, 0, 1, 0},
             {0, 0, 0, 0, 0, 1, 0, 0},
   {0, 1, 0 ,1, 0, 1, 0, 0},
   {0, 1, 0 ,1, 0, 1, 0, 0},
   {1, 0, 0, 0, 1, 0, 0, 1},
   {0, 1, 1, 0, 0, 1, 1, 1}};

/*입력 받을 시
int s1,s2;
scanf("%d %d",&i,&j); //Grid의 열과 행을 입력받는다.
for(s1=0; s1<i; s1++){
for(s2=0; s2<j s2++){
scanf("%d",grid[s1][s2]);
}
}
*/

int i, j, result=0;   //행과열 반복문을 위한 변수i,j
       //blob size를 구하기위한 변수 result

for(i=0;i<8;i++){
for(j=0;j<8;j++){
result=countCells(grid,i,j);
if(result>0)
{
printf("%d\n",result);   //blob을 출력
}

}
}

for(i=0;i<8;i++){           //전체배열을 출력
for(j=0;j<8;j++){
printf("%d ",grid[i][j]);
}
printf("\n");
}
return 0;
}


결과창