2015년 12월 30일 수요일

HLSL 내장함수, shader 함수

출처:여기

1. 삼각 함수

sin(x), cos(x), tan(x) : 기본삼각함수

asin(x), acos(x), atan(x) : 역삼각함수

atan2(y,x) : atan(y/x)에 해당하는 함수로, 
    atan(x)는 [-π/2, π/2]의 범위의 값을 가지지만, atan2(y,x)는  [-π, π]의 값을 리턴한다.
    atan2(y,x)는 x≠0 이면 항상 올바른 값을 계산핤 수 있으므로 더 선호한다.

sinh(x), cosh(x), tanh(x) : 쌍곡 삼각함수

sincos(x,s,c) : sin(x)와 cos(x)를 동시에 s, c로 리턴한다. 여기서 s, c는 x와 동일한 차원의 타입이어야 한다.

degrees(x) : 라디안 단위의 x값에 해당하는 각도값을 리턴한다.

radians(x) : 각도 단위의 x값에 해당하는 라디안값을 리턴한다.


2. 수학 함수
sqrt(x) : 제곱근

rsqrt(x) 
: 제곱근의 역수

exp(x), exp2(x), pow(x, y) : e^x, 2^x, x^y

ldexp(x) : x * 2^y

log(x), log10(x), log2(x) : loge(x), log10(x), log2(x)
→ 모든 로그함수의 인자값 x는 양수값으로 지정해야 한다.
    x가 음수이면 함수값이 정의되지 않고, x=0이면 -무한대를 리턴한다.


3. 값 변환 함수

abs(x)
 : 절대값

sign(x) : 부호에 따라 음수이면 -1, 0이면 0, 양수이면 1을 리턴

ceil(x) : 올림한 정수를 리턴
floor(x) : 내림한 정수를 리턴
round(x) : 반올림한 정수를 리턴
→ 리턴하는 정수값의 타입은 모드 float 타입이다.

max(x,y), min(x,y) : 최대, 최소값

clamp(x, min, max) : x를 [min, max] 범위로 클램프한다.
    즉, x가 범위안에 있으면 x를 그대로 리턴하지만, min보다 작으면 min을, max보다 크면 max를 리턴한다.

saturate(x) : x를 [0, 1] 범위로 클램프한다.

lerp(x,y,s) : 선형보간인 x + s(y - x) 를 리턴한다. x, y, s는 모두 동일한 타입으로 지정.

step(x,y) : x≤y 이면 1을 리턴하고, 그렇지 않으면 0을 리턴한다.

smoothstep(min,max,x) : x가 [min, max] 사이의 값인 경우에 대해서 [0, 1] 사이에서 부드럽게 변하는
    Hermite 보간법을 리턴한다. x가 min보다 작다면 0을 리턴하고, max보다 크다면 1을 리턴한다.

asfloat(x) : 입력인자값을 float 타입으로 바꾼다.
asint(x) : 입력인자값을 int 타입으로 바꾼다.
asuint(x) : 입력인자값을 uint 타입으로 바꾼다.

fmod(x,y) : x/y의 나머지를 실수로 리턴한다.

frac(x) : x의 소수점 이하 부분을 리턴한다.

frexp(x,e) : 주어진 실수 x의 표현에서의 소수점 이하값인 가수부분과 지수부분을 동시에 리턴한다.
    가수부분을 e로 리턴하고, 지수부분을 함수리턴값으로 리턴한다.

modf(x,i) : x의 정수부분을 i로 리턴하고, 소수점 이하부분을 함수리턴값으로 리턴한다.


4. 테스트 함수

a11(x) : 인자값의 모든 원소들이 0이 아닌지를 검사한다. 모두 0이 아니면 bool타입의 true값을 리턴한다.

any(x) : x의 원소중에 0이 아닌 원소가 하나라도 있으면 true값을 리턴한다.

isfinite(x) : 인자값이 무한대가 아닌 유한한 값이면 true를 리턴한다.

isinf(x) : 무한대 값(±INF)이면 true를 리턴한다.

isnan(x) : NAN(Not a Number)이면 true를 리턴한다.


5. 벡터 함수

cross(x,y) : 두 벡터의 외적을 계산한다. 두 인자값과 리턴값은 모두 float3 타입이다.

dot(x,y) : 두 벡터의 내적을 계산한다.
distance(x,y) : 두 벡터의 거리를 계산한다.
length(x) : 벡터의 길이를 계산한다.
→ 이들은 모두 하나의 float를 리턴한다.

normalize(x) : 정규화된 벡터를 리턴한다. 즉, 리턴값은 x/length(x) 와 동일하다.

determinant(m) : 행렬식을 리턴한다. 입력인자는 정방행렬이어야 한다.

transpose(m) : 전치행렬을 리턴한다.

mul(x,y) : 두 행렬의 곱을 계산한다.


6. 기타 함수

ddx(x), ddy(x) : 스크린공간의 x, y 좌표에 대한 x, y의 편미분을 리턴한다.
fwidth(x) : abs( ddx(x) ) + abs( ddy(x) ) 를 리턴한다.
clip(x) : x의 한 원소가 0보다 작으면 현재 픽셀을 버린다.
→ 이 함수들을 픽셀셰이더에서만 사용할 수 있다.

↓ 고급기법에서 사용되는 함수
faceforward(n, i, ng) : 관찰자를 향하는 표면 노말을 리턴한다.
reflect(i, n) : 반사벡터를 리턴한다.
refract(i, n, R) : 굴절벡터를 리턴한다.
lit(n·l, n·h, m) : 조명계수 벡터를 리턴한다.
noise(x) : 연기나 화재효과에 사용되는 Perlin 노이즈값을 리턴한다.

2015년 10월 18일 일요일

svn

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

svn merge


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

svn checkout URL Path

//부가 사항 테스트 필요
svn checkout -r 100 URL   (revision 100번 소스 받기)
svn checkout -r HEAD URL  (마지막 리비전 받기)


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

svn update Path

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

경로 만들기
svn mkdir Path\foldername

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

파일을 관리 대상으로 서버에 추가
svn add Path\filename.txt

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

svn commit Path --message comment

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

svn delete Path\filename.txt

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

출처 http://blog.naver.com/sjh77ch/62179981

SVN(Subversion)은 형상관리를 위한 도구이다. 다시 말하면 소프트웨어 개발의 버전 관리 시스템이다.

SVN에서 많이 사용되는 명령어는 다음과 같다.

checkout 또는 co - 저장소(repository)에서 로컬 작업공간으로 소스를 받아오는 것.
$ svn checkout 저장소URL [PATH...]
: 지정된 로컬경로에 저장소의 소스가 복사된다. 경로가 지정안되면 저장소URL의 맨마지막 디렉토리명이 저장될 디렉토리로 사용되어진다. -r 옵션으로 리비전을 지정한 경우엔 해당 리비전의 소스를 가져온다.
예제) svn checkout -r 99 http://repository/src src
설명) 저장소에서 리비전 번호 99의 src경로내의 소스를 가져온다.

update 또는 up - 저장소(repository)의 최신 내용으로 로컬 소스를 갱신 한다.
$ svn update [PATH...]
: 기본적으로 최신 리비전을 반영한다. 그러나 -r 옵션으로 리비전을 지정한 경우엔 그 리비전으로 맞춘다.

commit 또는 ci - 로컬에서 수정된 내용을 저장소에 적용시킨다.
$ svn commit [PATH...]
: 기본적으로 이 명령을 내리면 수정 사항을 코멘트할 수 있게 로그 편집기가 실행된다. lock된 파일이나 디렉토리는 commit성공후 자동적으로 unlock된다.

lock - 저장소의 파일이나 디렉토리를 잠근다.
$ svn lock TARGET
: lock이 걸린 파일이나 디렉토리는 다른 사용자가 변경하여 commit할 수 없다. 해당 경로의 작업이 너무 방대하여 그 동안 다른 사용자가 수정하지 못하도록 할때 유용.

unlock - 저장소의 잠근 파일이나 디렉토리를 풀어준다.
$ svn unlock TARGET
: lock의 반대. 기본적으로 lock을 건 사용자가 풀어줘야 한다.

add - 새 파일이나 디렉토리를 추가한다.
$ svn add PATH...
: add 명령은 지정된 PATH의 새로운 파일이나 디렉토리를 버전관리 대상에 등록할 뿐이므로, add후 commit 명령을 수행해야만 실제로 저장소에 해당 파일이 추가된다.

delete 또는 del, remove, rm - 파일이나 디렉토리를 제거한다.
$ svn delete PATH...(URL)
: delete 명령은 add와 반대로 해당 PATH의 파일이나 디렉토리을 버전관리 대상에서 삭제한다. 역시 commit 명령을 수행해야만 실제로 저장소에서 해당 목록이 제거된다. URL로 지정했을 경우 해당 목록은 즉시 저장소에서 제거된다.


copy 또는 cp - 로컬 사본이나 저장소 내용을 복사한다. 브랜치(branch)를 만들기 위해 사용.
$ svn copy SRC  DST
: SRC가 로컬경로이고 DST도 로컬경로일 경우, 로컬복사되고 commit시 저장소에 복사 목록이 추가 저장된다. SRC가 로컬경로이고 DST가 저장소URL일 경우, URL에 복사되고 즉시 commit됨. SRC가 저장소URL이고 DST가 로컬경로일 경우, 로컬로 checkout하고 commit시 저장소에 해당 사본이 추가.
SRC가 저장소URL이고 DST도 저장소URL일 경우, 저장소 내에 브랜치(branch)를 만듬.

move 또는 mv, rename, ren - 파일이나 디렉토리의 이름을 바꾸거나 이동시킨다. 이 명령은 copy후 delete와 같다.
$ svn move SRC  DST
: SRC가 로컬경로이고 DST도 로컬경로일 경우, 로컬로 rename 또는 move되고 commit시 저장소에 반영된다. SRC가 저장소URL이고 DST도 저장소URL일 경우, 저장소에서 rename,move가 바로 commit됨.

info - 해당 파일에 대한 정보를 출력한다.
$ svn info TARGET
: TARGET의 저장소 URL경로나 마지막 수정 일자등에 대한 정보를 보여준다.

log - 해당 경로나 파일의 로그( 리비전에 따라 변경된 내역)를 볼수 있다.
$ svn log [PATH]
: 지정된 로컬 PATH에 대한 로그를 출력한다. -r 옵션을 지정하면 출력할 리비젼 범위등을 정할 수 있다.
예제) svn log -r 30:100 test.c
설명) 리비전 번호 30~100 내에서 test.c에 대한 로그를 출력한다.

status 또는 stat, st - 로컬 경로의 파일이나 디렉토리의 상태를 보여준다.
$ svn status [PATH]
: 해당 파일이 수정, 추가되었는지 등의 정보를 보여준다. -u 옵션을 주면 저장소의 최신 리비젼이 얼마인지 알려준다.

diff 또는 di - 서로 다른 리비젼 간에 차이점을 출력해준다.
$ svn diff [-r N:M] TARGET
: 지정된 파일이나 경로에 대해 이전 리비젼하고 차이점을 보여준다. -r 을 지정하면 리비젼 N과 M사이의 차이점을 출력해준다.
예제) svn -r 30:45 test
설명) test 경로내에서 리비젼 번호 30과 45의 차이점을 출력해준다.

merge - 두 source 사이에 변경 내용을 작업 경로에 적용해준다.
1. $ svn merge URL1[@N] URL2[@M] [PATH]
2. $ svn merge [-r N:M] SOURCE [PATH]
: 1. URL1[리비젼 N]과 URL2[리비젼 M]을 비교하여, 변경 내용을 작업경로에 적용한다.
  2. SOURCE의 리비젼 N과 M을 비교하여, 해당 작업경로에 적용한다.
merge는 branch로 분리된 source에 대해 각각의 변경 내용을 현재의 작업에 병합하고자 할때 유용하다.

blame 또는 praise, annotate, ann - 지정한 파일이나 URL의 내용 수정내역을 각 라인별로 보여준다.
$ svn blame TARGET
: 해당 파일의 각 라인에 대해 리비젼과 작성자를 나타내 준다. 누가 언제 어떤행을 수정했는지 알수 있음.

import - 파일과 디렉토리를 저장소에 추가한다.
$ svn import [PATH] URL

: URL에 지정된 PATH의 하위 디렉토리는 재귀적으로 추가되며, 필요시 상위 디렉토리가 자동으로 생성된다.

export - 저장소에서 순수하게 프로그램 소스만 가져온다.
$ svn export URL [PATH]
: export는 버전관리를 위한 부속 파일들은 제외하고 순수한 소스만 받아오기 때문에, 주로 source release 용도로 사용되게된다. -r 옵션을 지정해서 해당 리비젼의 소스를 받아올 수 있다.



2015년 10월 2일 금요일

CodeIgniter


------------------------------------------------------------------------------

database 설정
application/config/database.php 값 세팅

$db['default'] = array(
'dsn' => 'mysql:host=localhost:33066;dbname=bkdb',
'hostname' => 'localhost:33066',
'username' => 'root',
'password' => 'qwer1234',
'database' => 'bkdb',
'dbdriver' => 'pdo',
        .
        .
        .

dsn :필히 입력해 줘야 하고
dbdriver : pdo로 해줘야 PDO 방식으로 적용됨

위 내용에서 hostname 과 database 는 주석 처리를 해도 됨

mysql:host=localhost:33066;dbname=bkdb 의 내용은

database가 mysql 이고
host 는 localhost, port는 33066
database에 붙여진 이름은 bkdb
(testDB 든 topic 이든 create database 하면서 지어준 이름)
   

------------------------------------------------------------------------------

설정값 가져오기
1. $this->config->item('base_url')
config.php 파일에 기술된 base_url 을 리턴



------------------------------------------------------------------------------
------------------------------------------------------------------------------
------------------------------------------------------------------------------
------------------------------------------------------------------------------
------------------------------------------------------------------------------
------------------------------------------------------------------------------
------------------------------------------------------------------------------
------------------------------------------------------------------------------
------------------------------------------------------------------------------
------------------------------------------------------------------------------

2015년 10월 1일 목요일

2015년 9월 30일 수요일

정규표현식


- \(.+\)
괄호를 포함하여 괄호에 싸여있는 모든 값 검색 됨

-------------------------------------------------------------------------

- ^+검색어
소스 상 한 줄의 가장 처음 나타나는 검색어를 검색
who is who 라면 앞의 who만 검색 됨

-------------------------------------------------------------------------

- 검색어+$
소스 상 한 줄의 가장 마지막 나타나는 검색어를 검색
who is who 라면 뒤의 who만 검색 됨
※ 특수문자 $ 를 찾을때
$12$\-\$25$
^\$를 하면 $가 문자처리되어 맨 앞의 $가 찾아짐

-------------------------------------------------------------------------

- .
모든 문자를 의미
...... 6개의 점은 6개의 글자를 가진 문자를 의미한다.

-------------------------------------------------------------------------

- [검색어]
[ ] 한 세트는 한 글자 의미
How Hone을 [ho]. 으로 검색하면 뒤에 .(점) 때문에 두글자를 찾되,
첫글자는 h또는o가 들어간 글자 중에서 찾게 된다.

-------------------------------------------------------------------------

- [검색어-검색어]
[c-k] c 부터 k 까지를 검색.
[C-Ka-d2-6] 등의 방법도..

-------------------------------------------------------------------------

-[^검색어]
[ ]내부의 ^(캐럿)은 부정의 의미
[c-k] c 부터 k 까지를 제외하고 검색.

-------------------------------------------------------------------------

- (on|ues|rida)
Monday Tuesday Friday

(Mon|Tues|Fri)day 하면 세 단어 전체가 모두 검색 됨
..(nd|esd|id)ay 해도 모두 검색됨, 앞에 점 두개는 두글자, 중간은 (), 끝은 ay

-------------------------------------------------------------------------

- 수량자(Quantifiers)  *, +, ?
a*b 는 b 앞에 a라는 문자가 있든 없는 다 검색한다.
a+b 는 b 앞에 a라는 문자가 1개 이상이면 있는 부분부터 다 검색한다.
a?b 는 b 앞에 a라는 문자가 없거나 1개이면 검색한다.

.* 는 모든 텍스트
-A*- 는 -(데시)앞에 -와A가 있든 없는 모두 검색

\*+ 는 + 앞의 것이 하나라도 있어야 검색
[^]+ 는 공백이 하나라도 있는 것을 검색


.{5} 는 어떤 것이든 5글자인 것 검색
[els]{1,3} 는 검색하려는 것이 1개 이상 3개 이하인 경우 검색
[a-z]{3,} 는 3개 문자 이상인 겨우 검색( 상한선이 없음)

AB*A 는 AB{0,}A와 같은 의미를 지닌다.
AB+A 는 AB{1,}A와 같은 의미를 지닌다.
AB?A 는 AB{0,1}A와 같은 의미를 지닌다.

r.* 는 r문자 뒤에 모든 문자를 잡는다.


수량자뒤에 바로 ? 가 올 경우 의미가 달라진다.
r.*? 의 경우
?가 *의 효력을 0~여러개 에서 0으로 바꿔버린다.
결국 r만 검색되고 .은 무용지물이 됨

r.+? 의 경우
?가 *의 효력을 1~여러개 에서 1으로 바꿔버린다.
결국 r과 뒤에 붙는 문자 하나만 검색됨

r.+? 의 경우
?가 *의 효력을 1~여러개 에서 1으로 바꿔버린다.
결국 r과 뒤에 붙는 문자 하나만 검색됨

-------------------------------------------------------------------------

- \w  word를 의미( 알파벳 과 숫자 그리고 _(언더라인) )
공백은 제외된다.
/w* 모든 문자 검색 ( = [A-z0-9] )
[a-z]\w*
\w{5} 문자 5개 검색

※ 대문자W는 문자가 아닌것 검색

-------------------------------------------------------------------------

- /d 는 0~9까지의 수 의미
※ 대문자D는 숫자가 아닌것 검색

-------------------------------------------------------------------------

- /b. 바운더리

\b\w 단어의 시작 스펠링이 강조
\w\b 단어의 끝 스펠링이 강조

\b\w+\b 1글자 이상인 단어를 강조

cat concat 에서
\bcat 이면 앞의 cat만 검색
cat\b 이면 두 단어의 cat 모두 검색

-------------------------------------------------------------------------

- \A...
문단에서 시작단어 중 3글자 단어 검색

-------------------------------------------------------------------------

- \Z...
문단에서 끝단어 중 3글자 단어 검색

-------------------------------------------------------------------------

- \w+(?=X)
X를 뺀 앞부분을 선택


-------------------------------------------------------------------------
-------------------------------------------------------------------------



2015년 9월 17일 목요일

python

Python

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

파일 찾기

import glob
files = glob.glob("*.exe")
print files

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

현재 디렉토리 알기

import os
print os.getcwd()

변경하기

os.chdir("C:/WINDOWS")
print os.getcwd()

경로내 모든 디렉토리 출력

print os.listdir('.')

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

import os,re

루트 디렉토리를 중심으로 하위 폴더 중에서 파일 찾기

os.walk - > 리턴 tuple 형식 ( 경로, 폴더들, 파일들 )

모든 폴더 탐색
for t in os.walk('Root'):
    print t

특정 파일 찾기
def findfile(filepattern, base = '.'):
    regex = re.compile(filepattern)
    matches = []
    for root, dirs, files in os.walk(base):
        for f in files:
          if regex.match(f):
             matches.append(root + '/' + f)
    print(matches)


remove(path)
파일 경로를 제거한다.
path가 디렉토리이면, OSError가 일어난다; (디렉토리를 제거하려면 rmdir()을 사용하라).

rename(src, dst)
src 파일이나 디렉토리 dst로 이름을 바꾼다.
dst가 디렉토리이면, OSError가 일어난다.


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

import shutil

copy(src, dst)
src 파일을 dst 파일이나 디렉토리에 복사한다. dst가 디렉토리이면, 지정된 디렉토리에 src와 바탕이름이 같은 파일이 생성된다(즉 오버라이트된다). 허가 비트도 복사된다. src와 dst는 문자열로 주어진 경로 이름이다.

move(src, dst)
재귀적으로 파일이나 디렉토리를 다른 곳으로 이동시킨다.
목적지가 현재 파일시스템이면, 그냥 src의 이름을 바꾸어라. 그렇지 않으면, src를 dst에 복사하고 src를 삭제하라.

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

import os.path as p
import glob

for item in glob.glob('*')
   if p.isfile(item): print item, ' is a file'
   elif p.isdir(item): print item, ' is a directory'
   else: print item, ' is of unknown type'

p.isfile(item)
p.isdir(item)

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

import time as t

t.localtime( )


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

JavaScript

JS 는 함수다!


--------------------------------------------------------------

- 역슬러시 \
: 뒤에 나온 것을 문자로 처리한다.
:: \+' (= 역슬래시+') 하면  ' 을 문자로 처리한다.

--------------------------------------------------------------

- Math
:: Math.random(); -> 0.11323 같은 1 이하의 랜덤한 수 제공

--------------------------------------------------------------

- document
현재 html 문서 자체를 의미
document.getElementById("아이디") 하면 해당 아이디의 html 객체 튀어나옴
document.write("내용")의 경우 전체 문서를 해당 내용으로 다시 쓴다

DOM, BOM  개념에 대한 서술이 필요

--------------------------------------------------------------

JQuery, ajax 서술이 필요

--------------------------------------------------------------

-http request

form 태그 전송
<form enctype="multipart/form-data" action="1.php" method="POST">
  <input type="hidden" name="maxFileSize" value="30000"/>
  <input type="file" name="userFile"/>
  <input type="submit" value="upload">
</form>

enctype : encoding type, multipart/form-data 로 해야 한다. 심오한 이유는 알면 쓰겠음
action="URL", 전송할 목표 웹서버 페이지의 URL
method="POST", 파일 전송의 경우라서인지 POST 방식을 선택 ( GET no no )

type="hidden" 항목에서 "maxFileSize"은 웹서버측 php파일에서 $_POST["maxFileSize"]로
받아서 사용한다.

파일의 경우도 $_POST["userFile"] 으로 사용할 수 있지 않을까? 하는 생각은 버리자
파일의 경우 $FILES 라는 약속된 변수에 저장되어 있다.
$FILES["userFile"] 으로 배열화 되어있는 파일의 정보에 접근할 수 있다.
$FILES["userFile"]["name"] //-> 파일 이름. 확장자
$FILES["userFile"]["type"] //-> image 인지 text 인지 / 형식?(png , plain 등 )
$FILES["userFile"]["tmp_name"] //->템프 경로, 파일을 목표 경로로 옮기기 전 잠시있는 곳
$FILES["userFile"]["error"] //-> 전송중? 에러 사항?
$FILES["userFile"]["size"] //-> 파일 용량

이후에 일어나는 일은 php 항목에서 "$FILES"를 검색해서 찾아볼 수 있다

--------------------------------------------------------------
--------------------------------------------------------------
--------------------------------------------------------------
--------------------------------------------------------------
--------------------------------------------------------------
--------------------------------------------------------------
--------------------------------------------------------------
--------------------------------------------------------------
--------------------------------------------------------------

--------------------------------------------------------------

- 참고사항
<script> </script> 사이가 아니라도 자바 스크립트를 사용하 수 있다.

input tag의 onclick 부분
<input type="button" value="white" onclick="alert('hello world')"/>

input tag의 onfocus, onblur 부분
<input type="text" onfocus="alert('focus')" onblur="alert('blur')"/>

--------------------------------------------------------------



2015년 6월 30일 화요일

mysql

mysql monitor 명령어

접속 부터
1) 윈도우키+R -> cmd

2) cd C:\Bitnami\wampstack-5.5.26-0\mysql\bin (비트나미로 부터 bin 폴더까지)

mysql -hlocalhost -uroot -p 엔터, 패스워드 넣으라 하면 DB 비번 입력


db 존재 확인
3) show databases; 명령으로 현재 존재하는 데이터 베이스 확인

db생성
4) CREATE DATABASE dbName CHARACTER SET utf8 COLLATE utf8_general_ci;

db삭제
5) 잘못 만들었으면 삭제 - DROP DATABASE dbName;

db사용
6) USE dbName;

--------------------------------------------------------------------------------

테이블 생성
1) CREATE TABLE `topic` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(100) NOT NULL,
  `description` text NOT NULL,
  `author` varchar(30) NOT NULL,
  `created` datetime NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

※ `topic`, `id` 등 에 쓰인 `은 물결표시 밑의 그레이브엑센트 이다.
일반 홑따움표와 다르다.
※ int(11) 11의 의미는 출력될때 11자리까지만 출력된다는 뜻

만들어진 테이블 확인
2) show tables;

3) 테이블에 행 추가하면서 데이터 삽입 - INSERT INTO `topic`
  (`id`, `title`, `description`, `author`, `created`)
  VALUES(
  'title_aaaa',
  'desctiption_aaaa',
  'author_aaaa',
  '2015-06-30 19:05:00'
);
id는 하나 하나 추가 될때만다 1, 2, 3 이런식으로 증가되서 자동 기입 된다.
auto_increment 속성 때문

테이블의 상세 모양세 보기
4) DESC tableName;

--------------------------------------------------------------------------------

내용 변경 - 추가
1) INSERT INTO tableName
 (colName1, colName2, colName3) VALUES (`값1`, `값2`, `값3` );

내용 변경 - 변경
2) UPDATE tableName SET colName1 = '값', colName2 = '값'
   WHERE colName3= '값';

내용 변경 - 삭제
3) DELETE FROM tableName WHERE colName = '값'

내용 선택
4) SELECT colName1, colName2 FROM tableName;

조건
SELECT colName1, colName2 FROM tableName
   WHERE colName3= 값 AND(OR) colName4= 값;

정렬
SELECT colName1, colName2 FROM tableName ORDER BY colName3 DESC(ASC);

Auto Increment 초기화, 모든 테이블 내용이 삭제 되야 초기화 됨
5) ALTER TABLE tableName AUTO_INCREMENT = 1;

--------------------------------------------------------------------------------

테이블 변경 - 컬럼 추가
1)ALTER TABLE tablename ADD name varchar(10);
ex) alter table [테이블명] add [컬럼명] varchar(100) not null default '0';

ALTER TABLE tablename ADD newColName varchar(10) AFTER existColName;


/* 컬럼 삭제 */
ALTER TABLE tablename DROP colname;

/* 컬럼명 변경 및 타입 변경 */
ALTER TABLE tablename CHANGE colname newcolname INT NOT NULL AUTO_INCREMENT;
CHANGE는 컬럼 속성뿐아니라 이름도 바꿔준다.

/* 컬럼 타입 수정 */
alter table [테이블명] modify [컬럼명] varchar(14);

/* 테이블명 수정 */
ALTER TABLE tablename RENAME newtablename;

/* 테이블 삭제 */
drop table [테이블명];

--------------------------------------------------------------------------------





2015년 6월 28일 일요일

php

php

php로 작성된 부분은 web server에 의해 php interpretor에 위임되어 행해지는 부분이고

java script로 작성된 부분은 web browser에 의해 행해지는 부분이다.

web browser 페이지의 소스를 보면 js는 작성한 그대로 보이지만

php코드 부분은 결과만을 확인할 수 있다. 이유가 바로 위에서 언급한 특징 때문이다.


<?php
php코드
?>
※<?php .. 에서 ?와 p 사이에 띄어쓰기 하면 안됨

<script>
java script 코드
</script>

---------------------------------------------------------------------

- echo
      echo "Hello world"; //문자의 경우" "로 감싸줘야 한다.
      echo 10000;
      echo "10000"+"10000"; //20000 출력
      echo "H"+"W";//0 출력
      echo "10" . "10";//1010 출력 // . 은 두 문자열 연결

---------------------------------------------------------------------

- $변수명
: 앞에 $를 붙인다.

---------------------------------------------------------------------

- 배열
$list = array("1","2","3"); // php , ※ var list = new Array("1","2","3"); // java script

- 배열의 크기
$size = count($list); // php , ※ var size = list.length; // js

---------------------------------------------------------------------

- 함수
function FuncPHP($input)
{
    return $input + 1;
}

- 함수 호출
FuncPHP(3);

---------------------------------------------------------------------

-디렉토리(경로) 관리
getcwd(); // 현재 디렉토리 구함
chdir("../"); // 경로 변경, ("../" 은 부모 경로 = 한 계층 위 의미 )
chdir("폴더명"); // 해당 경로로 이동

$dir = "./"; // = current directory
$files1 = scandir($dir);//경로내 파일들 순차 정렬
$files2 = scandir($dir, 1);//경로내 파일들 역순 정렬

만들기
mkdir("1/2/3/4", 0700, true);
//1이라는 폴더 밑에 2 밑에 3 밑에 4라는 폴더가 없으면 만든다. 있으면 warning
//0700: 권한 설정, 오너 그룹 아더, 자세한건 추후 기입
//true: 1/2/3 까지의 경로가 없다면 1,2,3을 만들어 준다는 설정 설정
---------------------------------------------------------------------

-파일명 보안
basename = 이하 b 로 표시
b("/etc/sudoers.d", ".d"); // -> "sudoers"
b("/etc/sudoers.d"); // -> "sudoers.d"
b("/etc/pass"); // -> "pass"
b("/etc/"); // -> "etc"
b("."); // -> "."
b("/"); // -> ""
//이렇게 파일명만을 추려내는 기능 이스케이핑 같은 목적으로 사용

---------------------------------------------------------------------

-ini 설정 runtime 변경
ini_set("display_error", "1");
//

---------------------------------------------------------------------

-이미지 파일 전송 받아 출력하기
form 태그로 전송 받은 경우 form 속 input 의 name="이름" 을 이용해서
$_POST["이름"] 으로 사용할 수 있지 않을까? 하는 생각은 버리자

파일의 경우 $FILES 라는 약속된 변수에 저장되어 있다.
"이름"은 폼 태그 하위 인풋 태그에서 사용한 name="이름" 의 그 이름이다.

$FILES["이름"] 으로 배열화 되어있는 파일의 정보에 접근할 수 있다.
$FILES["이름"]["name"] //-> 파일 이름. 확장자
$FILES["이름"]["type"] //-> image 인지 text 인지 / 형식?(png , plain 등 )
$FILES["이름"]["tmp_name"] //->템프 경로, 파일을 목표 경로로 옮기기 전 잠시있는 곳
$FILES["이름"]["error"] //-> 전송중? 에러 사항?
$FILES["이름"]["size"] //-> 파일 용량

$uploadDir = '경로\\';// 이 경로는 서버의 물리적 경로
//경로 까지만 담고있고 끝에 역슬래쉬가 두개 있는게 특징. 윈도우에서만 그렇다

$uploadFile = $uploadDir.basename($_FILES["이름"]["name"]);
//경로에 파일명을 붙여주는 작업,  .을 이용해 텍스트+텍스트 해준다.
//basename은 여기서는 이스케이핑 역할, 정확한 파일명만 추리기 위해

if( move_uploaded_file($_FILES["이름"]["tmp_name"], $uploadFile)){
  echo " 파일 유효 업로드 성공";
}
else {
  print "파일 업로드 공격의 가능성이 있음";
}
//임시파일로 존재하는 파일을 $uploadFile 로서 해당 위치와 파일명으로 이동

<img src="file/<?=$_FILES['userFile']['name']?>" />
//이미지를 출력, 이곳 src="URL" 임, php파일이 있는 경로에 이미지 파일이 있음

---------------------------------------------------------------------


---------------------------------------------------------------------
---------------------------------------------------------------------
---------------------------------------------------------------------
---------------------------------------------------------------------
---------------------------------------------------------------------
---------------------------------------------------------------------
---------------------------------------------------------------------
---------------------------------------------------------------------
---------------------------------------------------------------------
---------------------------------------------------------------------
---------------------------------------------------------------------
---------------------------------------------------------------------
---------------------------------------------------------------------
---------------------------------------------------------------------
---------------------------------------------------------------------
---------------------------------------------------------------------

2015년 6월 25일 목요일

css

참고 사이트

  <head>
    <meta charset="utf-8">
    <style>
      --여기가 CSS 부분, style 테그 안쪽 부분
    </style>
  </head>

----------------------------------------------------------------

- 반영될 항목 지정

html tag 이름 직접 입력 하는 경우

h1, h2, input {
   color: red;
   font-size: 10px
   text-decoration:underline;
}

//head 태그 하위의 h1에만 적용
header h1{
   border: 1px;
   border-style: solid;
   border-color: red;// transparent는 투명
}

//class="btn_start" 인 것에 적용
.btn_start{
   width: 250px;
   height: 35px;
   font-size: 17px;
}

//id="btn_start" 인 것에 적용
#btn_start{
    text-decoration: underline;
}

----------------------------------------------------------------


- css 파일 분리
  <head>
    <meta charset="utf-8">
    <link rel="stylesheet" type="text/csss" href="http://gsyan.iptime.org:8080/style.css">
    --link로 이 문서 외부에 존재하는 style.css문서의 내용을 이곳에 대체 한다는 뜻
    -- 중복의 제거, 수정작업 효율성 증대 기대



html

<!DOCTYPE html>
이 html 문서가 어떤 표준안에 따라 작성되었는가를 표현

--------------------------------------------------------------

<head>
이 안에 들어가는 내용들
</head>

<meta charset = "utf-8" /> // 한글이 안깨지게 해줌
<title> 웹 창의 타이틀 </title>

--------------------------------------------------------------

<body>
이 안에 들어가는 내용들
</body>

tag <a>

<a href = "url"> 링크 </a> // 현재 창에서 이동
<a href = "url" target="_self"> 링크 </a> // 현재 창에서 이동
<a href = "url" target="_blank"> 링크 </a> // 새창에서 열기


tag <ol>, <ul>

<ol>
<li>html</li>
<li>css</li>
<li>java</li>
<li>순서필요함 ordered list</li>
</ol>

<ul>
<li>지은호</li>
<li>지은동</li>
<li>순서필요없음 unordered list</li>
</ul>

Tag Reference

--------------------------------------------------------------

Debug
참고사이트

1) 크롬 우측 상단의 메뉴버튼 / 도구 더 보기 / 자바 스크립트 콘솔 -> 오류 메세지 확인

2) apache2 / logs / error.log 를 atom에서 열어서 제일 밑에 있는 최신 에러항목 확인


--------------------------------------------------------------


Escape( 이스케이핑)
&amp ->    &    (ampersand&, 앤드 기호)
&lt ->        <    ( less than )
&gt ->       >    ( greater then )
&quot ->    "     ( quatation mark )
&apos ->    '     ( apostrophe )


--------------------------------------------------------------

공백문자
&nbsp




2015년 6월 19일 금요일

git


=================================================
- 설치

http://www.git-scm.com/ 에서 다운로드

기본 설치

=================================================
- GUI 환경에서 다루기 위해 SourchTree 설치

http://www.sourcetreeapp.com 에서 다운로드 설치

=================================================
- git ignore 적용 시 윈도우에서 .파일명 안먹힐때

  1. Create the text file gitignore.txt
  2. Open it in a text editor and add your rules, then save and close
  3. Hold SHIFT, right click the folder you're in, then select Open command window here
  4. Then rename the file in the command line, with ren gitignore.txt .gitignore
=================================================

- 저장소 클론(다 가져오기)
git clone https://github.com/gsyan/Space119N.git
(실행된 폴더에 프로젝트명 폴더 생기고 그 안에 모든 파일들 복사됨)

-버전 다운
git checkout HEAD~1  : 한단계씩
git checkout HEAD~10

-다시 최신버전
git checkout master

-특정커밋으로 가기
sha : 8b3f06590783f7a570560d13b8d5022945c41767
git checkout 8b3f06590783f7a570560d13b8d5022945c41767




2015년 6월 18일 목요일

operator= 의 자기대입 방어

#include <memory>

class CBitMap
{
public:
CBitMap() { printf("BitMap()\n"); }
CBitMap(const CBitMap& b)
{ printf("CBitMap(const CBitMap& b)\n"); }
};

class CCharacter
{
private:
CBitMap* m_pb;

public:
CCharacter()
{
  printf("CCharacter()\n");
  m_pb = new CBitMap();
}

CCharacter(const CBitMap& b)
{
  printf("CCharacter(const BitMap& bp)\n");
  m_pb = new CBitMap(b);
  memcpy(m_pb, &b, sizeof(b));
}

void Swap(CCharacter& c)
{
  CBitMap* pbOrg = m_pb;
m_pb = new CBitMap(*c.m_pb);
c.m_pb = pbOrg;
}

CCharacter& operator=(const CCharacter& c)
{
  printf("operator=\n");

  //자기대입에 대한 방어
  //1안) 비교
  /*if( this == &c )//자기 자신이라면
  { return *this; }

  delete m_pb;//아무 조건 없이 지움
  m_pb = new CBitMap(*c.m_pb);//만약 여기서 예외가 발생한다면? m_pb는 망함;
  return *this;*/

  ///////////////////////////////////////////////////////////////////////////////////
  //2안) 원래 값을 따로 저장해 둔 후 삭제, new의 fail에 대처하는 자세
  /*CBitMap* pbOrg = m_pb;
  CBitMap* temp = new CBitMap(*c.m_pb);
  if(temp == NULL)
  { return *this; }
  m_pb = temp;
  delete pbOrg;*/

  ///////////////////////////////////////////////////////////////////////////////////
  //3안) 복사 후 맞 바꾸기(copy and swap)
  /*CCharacter temp(*c.m_pb);
  Swap(temp);
  delete temp.m_pb;
  return *this;*/
  }
};

int _tmain(int argc, _TCHAR* argv[])
{
CBitMap b;
CCharacter c1(b);

CCharacter c2;
c2 = c1;

return 0;
}

2015년 6월 17일 수요일

상속 객체 복사

class CCharacter
{
protected:
char* m_name;
public:
CCharacter():m_name(0) {printf("CCharacter()\n");}
CCharacter(char* name)
  {
  m_name = new char[strlen(name)+1];
  strcpy(m_name, name);
}
CCharacter(const CCharacter& c)
{
  printf("CCharacter& c \n");
  m_name = new char[strlen(c.m_name)+1];
  strcpy(m_name, c.m_name);
}
~CCharacter() { delete[] m_name; }
CCharacter& operator=(const CCharacter& c)
{
  printf("operator=\n");
  if(this == &c) { return *this; }

  if(m_name != NULL) { delete[] m_name; }
  m_name = new char[strlen(c.m_name)+1];
  strcpy(m_name, c.m_name);
  return *this;
}

char* GetName() { return m_name; }
};


class CHighElf : public CCharacter
{
private:
int m_level;
public:
CHighElf():m_level(0) {}
CHighElf(char* name, int lv=0):CCharacter(name), m_level(lv) {}
CHighElf(const CHighElf& h):/*CCharacter(h),*/ m_level(h.m_level)
{
  //괄호 위에 있는 CCharacter(h), 이 핵심
  //이 부분이 괄호 위로 올라감으로 해서 CCharacter 기본 생성자가 호출되지 않고
  //바로 CCharacter 복사 생성자가 호출.
  //CCharacter::CCharacter(h); // 이렇게 하면 기본 생성자 호출
  //m_level = h.m_level;
}
~CHighElf() {}
CHighElf& operator=(const CHighElf& h)
 {
  //CCharacter::operator=(h);//부모 클래스의 대입연산자도 호출해 줘야한다.
  m_level = h.m_level;
  return *this;
}

const int GetLevel() { return m_level; }

void Print() { printf("name: %s  level: %d\n",m_name, m_level); }
};

int _tmain(int argc, _TCHAR* argv[])
{
//상속없는 객체의 복사, 대입
CCharacter* c1 = new CCharacter("c1");
printf("c1 name: %s\n", c1->GetName());

CCharacter* c2 = new CCharacter(*c1);
printf("c2 name: %s\n", c2->GetName());

CCharacter* c3 = new CCharacter();
*c3 = *c2;
printf("c3 name: %s\n", c3->GetName());

delete c1;
delete c2;
delete c3;

//상속 객체의 복사, 대입
printf("==========================================\n");


//CHighElf(char* name, int lv=0) 호출
//따로 지정된 것이 있다. CCharacter(char* name) 호출.
CHighElf* h1 = new CHighElf("h1");
h1->Print();//이름 h1 정확이 들어가 있다.

//CHighElf(const CHighElf& h) 호출
//따로 지정된 것이 없기에 CCharacter()호출.
CHighElf* h2 = new CHighElf(*h1);
h2->Print();//name은 복사되지 않아 NULL이다.

//대입시 CHighElf의 맴버 변수만 복사처리 하기때문에 부모클래스의 것이 누락된다.
CHighElf* h3 = new CHighElf();
*h3 = *h1;
h3->Print();//name은 복사되지 않아 NULL이다.

//해결책은 해당 복사생성자와 대입연산자 구현부에 주석처리 되어있음

delete h1;
delete h2;
delete h3;

  return 0;
}

2015년 6월 16일 화요일

A Star 알고리즘 (길찾기)

준비사항
전체 Map은 2차원 행렬로 구성
출발점(S), 목표지점(D)
openList , closeList 구성.
openList 는 길(Path)의 경로 중 하나가 될 가능성이 열려 있다는 뜻
closeList 는 반대로 이건 더이상 볼 필요 없다는 뜻

맵과, 출발점S, 도착점D, 중앙에 세개의 장애물 존재
image

출발점을 우선 closeList에 추가한다.
그리고 8방향을 따져봤을때 다 갈수 있음을 알 수 있다.
이 8방향의 부모노드를 출발점으로 세팅해준다.
image

출발점으로 부터 8방향으로 이동하는 비용을 계산
수직, 수평 이동할 경우 10, 대각선 이동 할 경우 14를 적용한다.
이유는 말하지 않아도 알수있으리라(루트2 == 1.41414….)
비용을 사각 영역 왼쪽 아래에 기록( 이 비용을  R이라고 함 )
또 다른 비용 계산
8방향 각각으로 부터 D까지의 비용을 계산
이번엔 장애물의 존재 여부는 고려치 않고 수직,수평 이동만을 고려해서 계산
(대각이동은 없는 것으로 간주)
비용을 사각 영역 오른쪽 아래에 기록( 이 비용을  H 라고 함 )
image

총비용 F = R + H 으로 계산
사각 영역 왼쪽 상단에 기록
image

openList에 들어있는 지점들 중 총 비용이 가장 적은 곳을 선택
이 빨간 지점 중심으로 방금 한 일을 수행할 것이기 때문에
openList에서 제거하고 closeList에 넣는다.
8방향 체크해 보니 새롭게 openList에 넣어야 할 지점이 없다.
이동 불가의 장애물,
closeList에 속한 지점,
이미 openList에 속한 지점 들 뿐이다.
그러나 한가지 확인해야 할 것이 있다.
이미 openList에 속한 지점 중에서 현재 중심이 되고 있는 빨간 지점을 거쳐서 갈 경우
기존의 R값 보다 더 적은 값이 나오는지를 확인해 봐야 한다.
만약 빨간 지점을 경유했을때 더 적은 R값이 나왔다면 기존의 부모노드를 버리고
빨간 지점을 부모노드로 설정해 준다.
image

여기까지 작업했다면 새로운 중심점을 다시 선택하고 했던 작업을 반복한다. 
image


image


image


image


image


image


image


image


image


image


image


image


목표지점 D가 openList에 들어있는 것을 확인하는 순간 길은 찾아진 것이 된다.
지점D의 부모노드의 부모노드의 부모노드로 거쳐서 올라가다 보면
출발점이 나오기 때문이다.image


2015년 6월 14일 일요일

팩토리 패턴 (factory pattern)

우선 패턴의 형태

케릭터 ( 하이엘프, 휴먼 .. )

케릭터 메이커 ( 플레이어 메이커, 몬스터 메이커...)

만들어야 할 것들을 저렇게 구분 짓는다.

////////////////////////////////////////////////////////////////////////////////
우선 케릭터 부분에서 대략적인 활용 방법은 

CCharacter pCharacter = pPlayerMaker->Create("HighElf");

pCharacter->무엇이든();

delete pCharacter;

이런 식으로 생성하고, 쓰이고, 삭제 될 것이다. 

케릭터 클래스로 객체를 만들고 그 종류에 상관 없이 쓰이는 함수를 쓰다가 삭제

메이커 역시 그 종류에 상관없이 이름만 넣으면 적절한 케릭터를 만들어 주도록.

////////////////////////////////////////////////////////////////////////////////

우선 만드는 행동을 하려면 만들 것들이 대략적이나마 정해져 있어야 하니 정하자

#include <string>

class CCharacter
{
protected:
     string m_strName;
     virtual void LoadDate() = 0;
public:
     string& GetName() { return m_strName; }
};
class CHighElf : public CCharacter
{
protected:
     void LoadDate() {}
public:
     CHighElf() { m_strName = "HighElf"; LoadDate(); }
};
class CHuman : public CCharacter
{
protected:
     void LoadDate() {}
public:
     CHuman () { m_strName = "Human"; LoadDate(); }
};

다 되었다면 메이커도 만들자

class CCharacterMaker
{
protected:
     virtual CCharacter* Make(string& strType) = 0;//세부 메이커에서 구현
public:
     CCharacter* Create(string& strType)
     {
          CCharacter* pCharacter = Make(strType);
          return pCharacter;
     }
};
class CPlayerMaker : public CCharacterMaker
{
protected:
     CCharacter* Make(string& strType)
     {
          CCharacter* pCharacter = NULL;
          if( strType == string("HighElf") )
          { 
               pCharacter = new CHighElf();
          }
          else if( strType == string("Human") )
          { 
               pCharacter = new CHuman();
          }

          return pCharacter;
     }
};

이제 메인문에서 써먹어 보는 부분
int _tmain(int argc, _TCHAR* argv[])
{
CCharacter* pChar = NULL;
CCharacterMaker* pCharMaker = new CPlayerMaker();

pChar = pCharMaker->Create(string("HighElf"));
printf("%s 케릭터 생성\n", pCharacter->GetName().c_str());
delete pChar ;

return 0;
}

이것이 기본적인 팩토리 패턴이다.

이렇게 하면 케릭터를 만드는 부분에서 이름만 수정하면

다른부분, 예를 들면 행동하는 부분에서 코드를 수정하지 않아도 될것으로 보인다.

또한 개별 행동을 클래스 개별적으로 수정, 보완 할 수 있으니 다음에 찾아서 고쳐야 할때

찾기도 편하고 다시 이해 하기도 편할 것 같다.

2015년 6월 9일 화요일

연산자 오버로딩(operator)

이전부터 숙제로 남아있던 연산자 오버로딩에 덤벼보겠다
참고 사이트


#include <iostream>
using namespace std;

class A
{
private:
char* m_name;
int m_age;
public:
A() { cout<<"constructer-> A()"<<endl; m_name = 0; m_age=0; }
A(char* name, int age): m_age(age)
{
cout<<"constructer-> A(name,age)"<<endl;

m_name = new char[10];
strcpy(m_name, name);
}
A(A& copy)
{
cout<<"copy constructer-> A(A& copy)"<<endl;

m_age = copy.m_age;

m_name = new char[strlen(copy.m_name)+1];
strcpy(m_name, copy.m_name);
}
void ShowInfo()
{
cout << "이름: " << m_name << endl;
cout << "나이: " << m_age << endl;
}
A& operator=(A& ref)
{
cout<<"here="<<endl;

if(m_name == 0)
{ delete[] m_name; }
m_name = new char[10];
strcpy(m_name, ref.m_name);
m_age = ref.m_age;
return *this;
}
A& operator++()
{
cout<<"전위증가"<<endl;
m_age+=1;
return *this;
}
const A& operator++(int)
{
cout<<"후위증가"<<endl;
const A result(*this);
m_age+=1;
return result;
}
A& operator--()
{
cout<<"전위감소"<<endl;
m_age-=1;
return *this;
}
const A& operator--(int)
{
cout<<"후위감소"<<endl;
const A result(*this);
m_age-=1;
return result;
}


~A() { delete[] m_name; cout<< "~A()" << endl; }

};

int _tmain(int argc, _TCHAR* argv[])
{
        // 지역변수로 객체를 만들경우 잘된다.
        A a("a",1);
        A b("b",2);
        b = a; //오버로딩 된 연산자가 호출된다.


        ////////////////////////////////////////////////////////////
        A* a = new A("a",1);
        A* b = new A(*a);//복사생성자 이용하기 위해서는 a 아닌 *a로
        A* c = new A();
             
        c = a;//는 포인터라 연산자 호출이 안되고 디폴트 얕은 복사가 일어난다.

        *c = *a; // 이렇게 해주면 연산자 호출이 된다.

        c->ShowInfo();

        ////////////////////////////////////////////////////////////
 --a;
a--;
++a;
a++;

        return 0;
}

a = b 라는 것은
a.operator=(b) 라고 일반 함수 이해하듯 이해 해야 한다.

전위증가(감소)
후위증가(감소)
기록해 둠 () 안에 int를 적어두면 후위로 판단 하기로 약속이 되있다 함