2016년 12월 9일 금요일

[Python] 수학 import math


예제코드
 1)
print(10 + 5)
print(10 - 5)
print(10 * 5)
print(10 / 5)

2)
import math
print(math.ceil(2.2)) //3
print(math.floor(2.7)) //2
print(math.pow(2,10)) //1024
print(math.pi) //3.141592...



대부분의 수학관련 함수들이 math모듈에 존재하지만자주사용되는 아래의 함수에 대해서는 특별한 모듈 임포트없이 사용할수 있도록 내장함수로 제공한다.
-. 내장형으로 제공되는 수학관련 함수들
>sum(iterable[, start])
순회가능한(iterable)객체의 총 합계를 반환총 합계의 시작값(start)이 주어지면 그 값부터 누적되며그렇지 않은 경우 0이 기본값이 된다.
>>> sum([1,2,3]) #1 + 2 + 3 = 6
6
>>> sum([1,2,3],4) #4 + 1 + 2 + 3 = 10
10

>max(iterable)
순회가능한 객체의 최댓값을 반환
>>> max([1,2,3])
3

>min(iterable)
순회가능한 객체의 최솟값을 반환
>>> min([1,2,3])
1

>abx(x)
인자 x의 절대값을 반환
>>> abs(-11)
11

>pow(x, y[, z])
x y제곱값을 반환세번째 인자가 입력된 경우, x y제곱한 결과를 z로 나눈 나머지(modulo연산)를 반환
>>> pow(2,10) #210제곱
1024
>>> pow(2,10,100) #2 10제곱을 100으로 나눈 나머지
24

>round(x[, n])
인자 x의 반올림결과를 반환자릿수가 지정된 경우 반올림 결과를 지정된 자리까지 나타내며그렇지 않은경우 기본값은 0이다.
>>> round(3.141592) #소수점이후부터 반올림
3
>>> round(3.141592,2) #소수점 2자리 이후부터 반올림
3.14
>>> round(2341.1234,-1) #소수점 1자리 이전부터 반올림
2340.0

>divmod(a, b)
'a/b'의 몫과 나머지를 튜플형태로 반환
>>> divmod(10,7)
(1, 3)
>>> divmod(5.3,2.1)
(2.0, 1.0999999999999996)

>> math 모듈 <<
수학관련 함수들이 들어있는 모듈이며
모듈내의 함수는"import math"한후사용가능

-. 상수
math모듈에서 상수는 아래와 같이 정의되어 있다.
>원주율(π)
>>> math.pi
3.141592653589793

>자연상수(e) 
>>> math.e
2.718281828459045

-. 수치 연산
수학모듈에 정의되어있는 수치 연산 관련 함수는 아래와 같다.
>math.ceil(x)
'N >= x'를 만족하는 가장 작은 정수 N을 반환(올림 연산)
>>> math.ceil(3.14)
4

>math.floor(x)
'N <= x'를 만족하는 가장 큰 정수 N을 반환(내림 연산)
>>> math.floor(3.14)
3

>math.trunc(x)
x의 정수부분만을 반환(버림 연산)
>>> math.trunc(3.14)
3

>math.copysign(x,y)
y의 부호만 x에 복사하여 반환
>>> math.copysign(6.5,-0.0) #부호만 복사
-6.5

>math.fabs(x)
x의 절대값을 반환
>>> math.fabs(-6.5) #절대값연산
6.5

>math.factorial(x)
x의 계승(factorial,x!)값을 반환
>>> math.factorial(3.0) #factorifal연산(3!)
6

>math.fmod(x,y)
c라이브러리에 있는 fmod()함수를 호출,
파이썬 연산자중 '%'(나머지연산)과 유사하다하지만 연산결과가 항상 동일한것은 아니다. math.fmod(x,y)연산은 항상 피제수 x와 몫으 부호가 동일하지만 '%'연산은 몫이 피제수와 항상 일치하지 않기 때문이다또한 부동소수점 연사ㄴ의 정확도차이도 존재하기 때문에,
일반적으로 정수연산에는 '%'연산을
부동소수점연산에는 math.fmod()연산을 사용하는것을 권장한다.
>>> math.fmod(5.5, 3) #피제수와 제수의 부호가 같은 경우
2.5
>>> 5.5 % 3
2.5
>>> math.fmod(-5.5, 3) #피제수와 제수의 부호가 다른 경우
-2.5
>>> -5.5 % 3
0.5

>math.fsum(iterable)
입력받은 값의 합계를 반환
>>> math.fsum([1,2,3])
6.0

>math.modf(x)
입력받은 x의 순수 소수부분과 정수부분으로 분리하여 튜플로 반환
분리된 두 부분 모두에 부호가 할당됨
>>> math.modf(3.14)
(0.14000000000000012, 3.0)
>>> math.modf(-6.5)
(-0.5, -6.0)

-. 지수로그 연산
수학모듈에서 지원하는 일반적인 지수 연산과 로그연산에 관련된 함수는 아래와 같다.
>math.pow(x,y)
x y제곱결과를 반환
>>> math.pow(2,10)
1024.0
>>> pow(2,10)
1024
>>> 2**10
1024

>math.sqrt(x)
x의 제곱근(square root)한 결과를 반환
>>> math.sqrt(2) #2연산
1.4142135623730951
>>> math.sqrt(9) #9연산
3.0

>math.exp(x)
자연상수(e) x제곱결과를 반환
>>> math.exp(2)
7.38905609893065

>math.log(x[, base])
밑을 base로 하는 log X의 결과를 반환
만약 base가 입력되지 않으면자연로그(ln X)로 연산
>>> math.log(math.e) #'ln e'연산
1.0

-. 삼각함수 연산
각도를 표기하는 기법으로 60분법과 라디안(radian)이 있다이에 대한 상호 변환함수는 아래와 같다.
>math.degrees(x)
라디안으로 표현된 각도를 60분법으로 변환

>math.radians(x)
60분법으로 표현된 각도를 라디안으로 변환

아래는 파이썬에서 주로 사용되는 삼각함수이다.
>math.sin(x)
>math.asin(x)
>math.cosh(x)
>math.asinh(x)
>math.cos(x)
>math.atan(x)
>math.sinh(x)
>math.atanh(x)
>math.tan(x)
>math.acos(x)
>math.tanh(x)
>math.acosh(x)

삼각함수의 사용방법에 대한 예
>>> r = math.radians(30) #30도를 라디안으로 변환
>>> math.sin(r) #sin(30)연산
0.49999999999999994
>>> r = math.radians(180) #180도를 라디안으로 변환
>>> v = math.cos(r)
>>> v
-1.0
>>> r == math.acos(v) #cos() acos()으로 수행한 값을 상호비교
True
>>> math.degrees(r) #π 라디안을 60분법으로 변환
180.0

※ 위의 예제에서 sin(30)가 정확히 0.5가 아닌 0.49999999999999994로 출력되는것은 컴퓨터에서 부동소소줌을 표현하는 방식때문에 발생하는 문제이다이에 대해서는 이후에 나오는 십진법모듈에서 자세히 알아보도록 하겠다.


출처 : http://blog.naver.com/PostList.nhn?blogId=dudwo567890 <- 분수, 십진수 등 다양한 파이썬 예제블로그

[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