마인크래프트(MineCraft) 1.14.2 소닉 쉐이더 설치


윈도우 기준

1. 마인크래프트 버전 1.14.2 한번 실행 후 종료


2. 옵티파인 설치시 자바가 깔려 있어야 함

java -version 명령어를 통해 자바 설치 확인 및 비트 확인

32비트로도 구동가능하나 본인 운영체제가 64비트이면 64비트 설치 추천

자바가 안깔려 있다면 아래 링크에서 설치

https://java.com/ko/download/


3. 소닉 쉐이더 설치 전 옵티파인 설치 진행

https://optifine.net/downloads   

위의 링크에 들어가서 Preview version을 클릭하면 아래와 같은 화면이 나옴

1.14.2 버전에 맞는 파일 다운로드 진행

preview_OptiFine_1.14.2_HD_U_F1_pre13.jar

다운로드 후 바로 실행하면되고, 마인크래프트 설치시 기본경로로 되어있다면, 이것도 기본경로로 설치하면 상관없음
(별도 경로 지정시 경로 맞춰줘야 함)




4. 소닉 쉐이더 설치

소닉 쉐이더에는 여러가지 버전이 있음

자신의 컴퓨터에 자신이 있다면 Extreme-Volumetric lighting하면된다.
자신이 없다면 Medium, High 등 적용해보면서 제일 적당한 것으로 선택

Extreme-Volumetric lighting은 엔비디아 RTX 시리즈에 나온 레이트레이싱 기능과 유사하다고 생각됨.
(Medium이나 High 버전은 실행 안시켜봄)

좌 : 일반 마인크래프트, 우 : Extreme-Volumetric lighting 소닉쉐이더 적용


5. 소닉쉐이더 적용

소닉쉐이더를  다운로드 했으면, 

윈도우키+R누르고 %appdata% 실행

.minecraft 폴더에  들어간  후 shaderpacks 폴더를 찾아 다운로드한 파일을 그대로 넣어 주면 됨
(폴더가 없으면 shaderpacks 생성하고 넣으면 됨)
(쉐이더 파일은 압축 풀 필요 없이 그대로 넣으면 됨)


6. 마인크래프트 실행
실행하면 1.14.2-Optifine이 플레이버튼에 추가 되었을테고, 그대로 실행하면됨


7. 마인크래프트 실행 후 적용
마인크래프트에 접속해서 설정 -> 비디오설정 -> 쉐이더 -> 다운받은 소닉쉐이더 적용 
(옵션 설정하면서 본인 컴퓨터에 맞는 설정 값 찾아서 사용)


끝.

추가 정보 : 횃불 들었을 때 주변을 밝게하고 싶으면 옵티파인 설치 후 설정 -> 비디오 설정 -> 동적 조명에서
"빠르게" 또는 "화려하게"로 바꿈




우분투(Ubuntu) 리눅스 SSH 설정 및 연결 방법


라즈베리파이3에 우분투를 올리면서, SSH를 연결하려고 했다. 

근데 피치못할 문제때문에 시간이 좀 잡아먹어서 안까먹을려고 포스팅




apt-getupdate

 (sudo) apt-get update


ssh openssh-server 설치 

apt-get install openssh-server


ssh 클라이언트와 서버를 동시에 설치

 (sudo) apt-get install ssh


방화벽 해제

 (sudo) ufw enable
(sudo) ufw allow 22
(sudo) ufw reload


ssh 서비스 시작

 (sudo) service ssh start



제대로 구동되는지 확인

 (sudo) service ssh status
(sudo) ps -ef | grep sshd
(sudo) netstat -ntlp | grep sshd

* 공유기 포트포워딩 *

필자는 SK 공유기를 사용하고 있고, 공유기 접속 IP는 192.168.25.1

로그인하고 방화벽 -> 포트포워딩탭에서 추가해준다.

외부에서 공유기 접속할때 22번포트로 접속하면 내부IP주소+포트로 포워딩해주는 것이다.





* 공유기 사용할 때 중요 *

만약 공유기를 쓰고 있으면 고려해야 할 것이 하나 더 있다.

같은 공유기내에서 서버, 데스크탑이 있고 데스크탑에서 서버로 SSH 접속하려고 하면

외부 공인 IP주소가 아니라 내부 공유기가 할당한 IP주소를 입력해야 접속이 된다.

(같은 공유기 대역이면 공인IP가 아닌 사설IP로 SSH 접속)


같은 공유기를 사용하고 있지 않다면
(테더링, 다른 장소 등)

원래 접속하던대로 공인 IP로 SSH 붙으면 된다. 








라즈베리파이3 리눅스 OS (우분투) 설치 방법


오랜만의 포스팅


학생때 어쩌다 얻게된 라즈베리파이3이 있었다. 

항상 라즈베리파이3으로 뭔가를 해보고싶다.. 라고 생각만했지 이러저러한 이유로 계속 안하고 있었다.(귀찮아서)

그러다가 라즈베리파이3에 마인크래프트 서버를 올리고, 개인 개발서버로 쓰자! 라고 생각해서 오늘 추진하게 되었다.
(결과적으로 라즈베리파이3에  마인크래프트 서버를 올렸으나, 쾌적한 서버가 아니어서 비추)



라즈베리파이3 OS 종류 및 선택

라즈베리파이3을 쓰기로 마음먹고, 제일 먼저했던 고민은 어떤 운영체제를 사용할 것인가? 였다.

기존에 쓰던 우분투(서버), 우분투(데스크탑), 우분투(마테), 서버용으로 많이쓰는 CentOS, 라즈베리파이 전용 Raspian,
윈도우 10 IoT 등을 고려했다.

결과적으로 우분투18.04(라즈베리파이)버전을 선택했다. 

아무래도 우분투가 익숙하기도 하고, 나중에 여러모로 하기에 편할 것 같아서 선택했다.
(라즈비안, 마테를 고민했으나 역시 오리지널이 제일 자료도 많을거 같으니 선택)


라즈베리파이3 우분투(Ubuntu) 설치


https://www.raspberrypi.org/downloads/
위의 링크를 클릭하면 위의 홈페이지가 나오는데, Ubuntu Server를 선카드 하면 된다.

그럼 아래와 같은 창이 나오고 맨 밑에 Ubuntu server image for Raspberry Pi3을 클릭하면 된다. 


그럼 압축파일을 다운받게 될 것이고, 압축을 풀면 ubuntu-18.04.2-preinstalled-server-arm64+raspi3.img 파일이 떨어진다.

이미지 파일을 구했으니, 이제  microSD카드에다가 구우면 된다.

microSD카드는 그냥 컴퓨터에 연결하기 어렵기때문에 리더기가 필요하다!

기본적으로 라즈베리파이3 세트를 사면 다 포함되어있다. 근데 잃어버려서 다이소가서 2000원짜리 sd카드 리더기를 샀다.

근데 sd카드 리더기가 이상했던지, SD카드를 꼽았는데도 인식이 안됐다.. 그래서 막 쑤셔넣다가.. 이래됐다..

덕분에 다이소 가서 5000원짜리 SD카드리더기와 micro SD카드를 또 샀다!(내돈!!)


(5000원 짜리  SD카드 리더기)


다시 돌아와서, Micro SD카드를 리더기에 꼽는다. 본체에 연결한다. 그리고 도구를 써서 부팅디스크를 만들면 된다.

win32diskimager-1.0.0-install.z01 win32diskimager-1.0.0-install.zip

(URL : https://sourceforge.net/projects/win32diskimager/)

microSD카드에 구울 도구들이다.

도구를 실행하면 위와 같은 프로그램이 시작될 것이다. Image File에는 아까 다운받았던 .img파일을 놓고

Device는 SD카드를 선택하면된다!(다른 것 선택하지 말것)

그리고 하단에 Write를 누르면 끝이다!
(5~10분소요)


완료되면 위와 같이 system-boot이 나오는 것을 확인할 수 있다.

그럼 이제 sd카드 리더기에서 micro SD카드를 꺼내서~ 라즈베리파이에 뾱! 하고 꼽아주면된다!!



(내 라즈베리파이 3)

위 그림 뒤에 micro SD카드 꼽는 곳이 있다.
(라즈베리파이를 케이스에 고정하려고 나사를 꼽아야되는 데 여간 귀찮은게 아니었다)

SD카드를 꼽고, HDMI을 모니터에 연결하고, 파워를 꼽으면 바로 부팅이 된다!  (진짜 바로!)


(바로 실행된다!)

실행되면 끝이다! 

설치시간은 한 10~15분 정도 소요되는 것같았으며, 공유기를 통해 랜선을 꼽았는데, 인터넷도 바로 잡아줬다.

이후 로그인이 나오는데

ID: ubuntu, PWD : ubuntu

로 로그인을 하면된다. 그리고 로그인하게 되면 바로 비번바꾸라고 하니, 바꿔주면 된다.


마지막으로 시간을 동기화하기 위해 date명령어를 입력한다.

아마 UTC기준으로 시간이 찍혀있을 것이고, 한국시간으로 맞춰줘야한다.

ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

다시 date를 하면 KST라고 찍힐 것이다. 

그리고 시간이 안맞다면 아래와 같은 명령어로 동기화시켜준다.

(sudo) apt-get install rdate
(sudo) rdate -s time.bora.net


그리고 다시 date 명령어를 통해 시간을 확인한다. 




sd카드 리더기가 고장안나고 뻘짓만 안했으면, 1시간이내에 설치가 가능했을거라 생각한다.

앞으로 라즈베리파이3 서버로 요것저것 만들 예정이다.




R을 활용한 데이터 시각화




PLOT() 함수
PLOT()은 산점도 뿐만 아니라 일반적으로 객체를 시각화하는데 모두 사용될 수 있는 일반 함수.
일반 함수란 주어진 데이터 타입과 옵션에 따라 여러 종류의 그래프(산점도, 선그래프등)를 그릴 수 있다.

그래픽 옵션
plot()과 같은 그래픽 함수들은 여러가지 파라미터들로 그모양을 다듬을 수 있다.
자세한 내용은 ?par의 도움말을 확인하면 된다.

 옵션

설명 

xlab 

x축의 이름 

ylab 

y축의 이름 

main 

그래프 제목 

pch 

점의 종류 

cex 

점의 크기 

col 

색깔 

 xlim

x좌표축 값의 최대 범위 

ylim 

y좌표축 값의 최대 범위 

type 

그래프의 종류 


type옵션으로 그래프의 종류를 변경할 수 있다.

"l"은 직선, h는 수직선, s는 계단형, o는 점과 선을 overlap해서 그린다. 그외에도 다양한 옵션이 있다.



점(points)
pints()는 점을 그리는 함수이다. plot()을 연달아 호출하는 경우 매번 새로운 그래프가 그려지는 것과 달리 points()는 이미 생성된 plot에 점을 추가로 그려준다.


선(lines)
lines()는 points()와 마찬가지로 plot()으로 새로운 그래프를 그린 뒤 선을 그리는 목적으로 사용된다.


직선(ABLINE)
abline은 y = a + bx 형태의 직선 또는 h=y형태의 고로로 그은 직선 또는 v= y형태의 세로로 그은 직선을 그래프에 추가할 수 있다.


identify()
그래프상에서 특정 점을 클릭하면 클릭된 점과 가장 가까운 데이터의 번호를 표시해준다. 작업을 중단하려면 ESC키를 누른다.



범례(legend)
legend()는 범례를 표시하는데 사용된다. 가장 기본적인 형식은 legend(x, y=NULL, legend)인데, 범례가 보여질 (x,y)좌표를 지정할 수 있고, 사전에 정의된 키워드 중 하나로 범례의 위치를 지정해도 된다.


막대 그래프(Barplot)
흑히 볼 수 있는 막대 모양의 그래프로 다양한 형태로 사용될 수 있다.


히스토그램 Hist()
자료의 분포를 알아보는데 유용한 그래프는 히스토그램이다.


파이 그래프(PIE)
데이터 비율을 알아보는데 적합하다.


모자이크 플롯(MOSAICPLOT)
범주형 다변량 데이터를 표현하는데 적합한 그래프이다. 모자이크 플롯에는 사각형들이 그래프에 나열되며, 각 사각형의 넓이가 각 범주에 속한 데이터의 수에 해당한다. 타이타닉호 생존자의 정보를 담고 있는 Titanic데이터를 사용해 모자이크 플롯을 그려본다.
타이타닉은 table 클래스의 데이터이며 속성은 객실 부분, 성별, 성인인지의여부, 생존여부로 구성되어있다.



산점도 행렬(PAIRS)
산점도 행렬(Scatter Plot Matrix)은 다변량 데이터에서 변수 쌍간의 산점도 행렬을 그린 그래프
다음 코드는 iris 데이터에서 각 종별로 산점도 행렬을 그린다.



등고선 그래프
값이 같은 곳들을 선으로 연결한 등고선을 이용해 데이터를 표시


CHERNOFF FACE DIAGRAM
얼굴의 체르노프 얼굴은 다차원 통계 데이터를 사람의 얼굴 이미지를 이용해 시각적으료 표현하는 방법이다.



GGPLOT2
기본 R 그래픽스에서 제공하는 대부분의 작업을 효과적으로 수행할 수 있는 시각화 기본 패키지이다.
ggplot2의 문법을 구성하는 요소는 다음과 같다.
- 데이터 프레임
- 색상, 크기 같은 외적요소
- 점, 선, 모양 같은 기하학적 요소
- 통계적 처리 방법
- aes에서 사용할 스케일(scale)

위 상태는 ggplot2에서 어떤 데이터를 사용할지만 지정된 상태이다.
어떤 모양의 그래프를 원하는지 입력하지 않았기 때문에 그래프가 출력되지 않는다.

aes(색상, 크기 등의 원하는 디자인) 요소를 추가하면된다.

GEMO_의 종류

abline 

절편과 기울기를 이용하여 그리는 직선 

area 

영역 그림 

bar 

막대그림 

boxplot 

상자그림 

density 

smooth density 

histogram 

히스토그램 

hline/vline 

수평직선/수직직선 

jitter 

점 흐트려 그리기 

line 

x값 순서로 점 연결하여 그리는 직선 

smooth 

smooth line 


동적인 그래프 만들기(GOOGLEVIS)
install.packages("googleVis")
library(googleVis)


ggmap
지도 정보를 표기해주는 라이브러리


'Develop > R' 카테고리의 다른 글

R을 활용한 데이터 시각화  (0) 2018.01.09
R을 활용하여 데이터 처리하기  (0) 2018.01.08
R의 DataType이해  (0) 2018.01.08
R의 기본 사용법  (0) 2018.01.08

데이터 처리

머신러닝 또는 데이터 마이닝 등의 프로젝트에서 모델을 만드는데 소용되는 시간은 전체 프로젝트의 14%정도이며,
그 중 데이터 전 처리 단계의 소요시간은 다른 단계들에서의 소요시간보다 큰 경우가 많은 작업이다.

  1. 파일 입출력
    일반적인 text 파일을 읽거나 쓴다.

    data = read.table("~.csv", header=TRUE, sep=",",stringsAsFactors=FALSE,comment.char="#",fileEncoding="UTF-8",encoding="CP949")

    ~.csv파일을 읽어 data.frame형태로 저장
    header : TURE이면 헤더 정보 있음
    sep : 필드 구분자를 지정. default필드 구분자는 blank
    stringsASFactor : TRUE이면 문자열을 FACTOR 형태로 저장
    comment.char : 주석의 시작 문자 지정
    fileEncoding : 파일의 인코딩
    encoding : R의 인코딩


    write.table(data,file="~.csv", append=FALSE, quote=TRUE, sep=",", row.names=TRUE)

    data 변수에 저장된 데이터를 ~.csv파일로 저장
    quote : TRUE, 필드의 값을 , 으로 묶음
    sep : 필드의 구분자를 지정. Default 필드 구분자는 blank
    row.names : TURE, 각 행의 이름도 저장


  2. CSV 파일 읽기
    CSV 파일을 읽으려면 read.csv()를 사용한다.
    이 함수는 파일명과 첫째 행이 header인지를 구분하기 위한 파라미터를 받는다.
    read.csv(파일명,header=TRUE)와 같은 형식으로 호출

    처음부터 문자열을 Factor가 아닌 문자열 타입으로 읽어 들이도록 하려면 stringsAsFactors=TRUE를 지정
    나중에 변경하기 위해서 x$name = as.character (x$name)

    na.strings
    NA를 지정하는 문자열을 지정, 디폴트는 NA, 다른 문자열로 NA가 지정되었을 경우 모두 문자열로 반환
    na.strings='NIL'

    1.csv의 내용


  3. 엑셀 파일 읽기 
    xlsx 패키지를 install하여야 한다. library(xlsx)하여 패키지를 불러온다.

    read.xlsx("이름","sheet")이다.

  4. APPLY 함수
    R에서는 다양한 벡터 또는 행렬데이터에 임의의 함수를 적용한 결과를 얻기 위한 apply류의 함수들이 있다. 이들 함수는 벡터, 행렬, 리스트, 데이터프레임에 적용할 함수를 명시하는 형태로, 함수형 언어 스타일에 가깝다. apply,lapply,sapply,tapply,mapply등이 있다.

    APPLY함수 : 행렬의 행또는 열방향으로 특정함수를 적용하며 apply(행렬, 방향, 함수)형태로 호출한다.
    '방향'은 1이면 행 2이면 열이다.



    LAPPLY함수 : 인자로 리스트를 받을 수 있다.





  5. DPLYR패키지
    데이터처리에 특화되어 있는 R 패키지
    데이터사전처리작업을 위해 다음과 같은 기능을 제공
    -Filtering(데이터 추출)
    -Selecting columns(변수선택)
    -Adding new variables(변수추가)
    -Sorting(정렬)
    -Aggregating(집계)


    dplyr의 장점은 처리 속도 뿐만 아니라 가독성이 좋다. 체인(%>%)이라는 것을 이용해 데이터가 어떠한 처리의 흐름을 갖는지 파악하기 쉽게하였다. 그렇기 때문에 내가 만든 처리 구문을 타인에게 전달할 때도 큰 장점을 갖는다.


    filter: 조건 추출




    select: 변수 선택




    mutate : 변수 추가



    arrange : 정렬



    group_by, summarise : 집계
    데이터를 정렬한 뒤, 그룹별 요약 결과 보기

    chain 
     - 여러 명령을 연결해 한 번에 수행할 수 있도록 하는 기능
     - 연결기능은 %>%로 이루어짐.

    데이터 프레임 조작(subset,transform,split)
    데이터 프레임은 가장 보편적으로 사용하는 형태의 데이터타입이다. 

    subset() : 함수를 사용해서 원래 데이터프레임과 선택조건을 주어 조건을 만족하는 일부데이터만 선택할 수 있다.

    transform : 기존 데이터들의 연산 결과를 새로운 열 데이터로 생성하여 기존 데이터프레임에 추가하거나 다른 이름의 데이터프레임으로 저장할 수 있다.

    split : 2번째 인자를 그룹요인(grouping factor)으로 하여 1번째 인자 데이터를 그룹화한 목록으로 생성한다.


'Develop > R' 카테고리의 다른 글

R을 활용한 데이터 시각화  (0) 2018.01.09
R을 활용하여 데이터 처리하기  (0) 2018.01.08
R의 DataType이해  (0) 2018.01.08
R의 기본 사용법  (0) 2018.01.08

R의 DataType 이해


  1. 스칼라(SCALAR)
    숫자, 문자등의 단일 값을 저장하는 data type

    숫자 : 정수 및 부동소수 지원

    문자열 :
    문자열 데이터를 저장하는 data type

    진리값(Boolean) : TRUE, FALSE판단 &(AND) , |(OR), !(NOT)사용



    NA(결측치) : 만약 데이터에 값이 존재하지 않는다면 NA로 표시함. is.na() 함수로 NA 확인가능


    요인(Factor) : 범주형(Categorical) 변수를 위한 데이터 타입. 미리 정해진 여러 개의 값 중 하나의 값을 가짐



  2. 벡터(VECTOR)
    - 같은 데이터 타입을 갖는 1차원 배열 구조
    - 여러 개의 데이터를 모아서 함께 저장하는 것을 의미
    - c(), seq(), rep() 함수 사용 가능
    - 벡터는 중첩 불가능( 벡터의 한 요소로 또 다른 벡터를 사용할 수 없음, 하나의 벡터로 통합)


  3. 리스트(LIST)
    리스트는 (key,value)형태로 데이터를 저장하는 일종의 배열 기존의 배열과 차이점은 데이터형을 서로 혼합하여 저장할 수 있다.
    리스트는 list(키=값, 키=값,..)형태로 데이터를 나열해 정의한다.



    이처럼 리스트에는 다양한 값들을 혼합해서 저장할 수 있다. 따라서 리스트안에 리스트 삽입이 가능 하다.



    리스트내 데이터 접근 : 위에서 본 바와 같이 리스트를 출력해보면 "$키" 형태로 각 키들이 나열된다.
    데이터는 '리스트 변수명$키'와 같이 접근한다. 또는 각 요소를 순서대로 '리스트변수[[인덱스]]'와 같이 접근 가능하다.


  4. 매트릭스(MATRIX)
    벡터와 마찬가지로 행렬에는 한가지 유형의 스칼라만 저장할 수 있다. 따라서 모든 요소가 숫자인 행렬은 가능하지만
    '1 열은 숫자, 2열은 문자열' 과 같은 형태는 불가능하다.
    행렬은 matrix()를 사용한다. 
    행렬값을 위쪽 행부터 채우고 싶다면 byrow를 사용



    행렬의 각 요소는 행렬이름[행인덱스,열인덱스'로 접근할 수 있다. 이때, 인덱스는 벡터의 경우와 마찬가지로 1부터 시작
    1,2행의 데이터만 추출한경우
    1행, 3행, 1열, 3열의 값만 추출한 경우


    행과 열에 명칭을 부여하고 싶다면 dimnames()를 사용



  5. 데이터 프레임(DATA FRAME)
    - 각기 다른 데이터 타입을 갖는 컬럼으로 이루어진 2차원 테이블 구조
    - 행렬과 동일한 형태이나 행렬과 달리 다양한 변수, 범주등을 표현 가능
    - 서로 다른 컬럼은 데이터 타입이 다를 수 있음
    - data.frame() 함수를 이용하여 생성하며 각 컬럼, 행의 이름을 지정



  6. 데이터 프레임의 각 열은 $변수명으로 접근할 수 있다. 행이나 열의 인덱스를 사용해서도 접근 가능



    데이터 프레임의 행 이름, 열 이름은 각각 rownames(), colnames()함수로 지정가능




  7. TYPE 판별 및 변환
    is.factor, is.numeric(숫자벡터), is.character(문자열 벡터), is.matrix, is.data.frame등의 "is.*"형태의 함수들을 사용해
    데이터의 타입을 확인할 수 있다.


'Develop > R' 카테고리의 다른 글

R을 활용한 데이터 시각화  (0) 2018.01.09
R을 활용하여 데이터 처리하기  (0) 2018.01.08
R의 DataType이해  (0) 2018.01.08
R의 기본 사용법  (0) 2018.01.08

R의 기본 사용법


  • R은 1줄씩 처리하는 인터프리터 언어

  • >는 명령 프롬프트. 원하는 명령을 치고 엔터로 실행

  • R은 대소문자를 구분

  • 만약 이전에 했던 작업을 다시 수행하고 싶으면 ↑키 사용

  • 종료하려면 q()

  • 작업하는 내용을 저장할 작업 디렉토리를 지정하고 진행하는 것이 좋음.


  1. 산술 연산자

  2.  기호

    의미 

    +

     덧셈

     -

     뺄셈

     *

     곱셈

     /

     나눗셈

     %/%

     정수나눗셈

     %%

     나머지

     ^.**

    거듭제곱 




  3. 주석문
    주석문은 실행되지않으며, #으로 명시한다.




  4. 세미콜론
    여러 개의 식을 한줄레 쓸 수 있으며, ; 로 명시한다.




  5. 주요 수학 함수

  6.  함수

    설명 

    abs(x) 

    x의 절대값 

    ceiling(x),floor(x),trunc(x) 

    버림 함수들로 각각 x보다 큰 수중 가장 작은 정수

    x보다 작은 수 중 가장 큰 정수

     0과 x사이의 가장 큰 정수 출력 

    round(x,digits=y) 

    x의 반올림 함수들로 각각 x의 소수점 y자리에서 반올림 

     exp(x)

    지수함수 

    log(x), log10(x), log2(x),logb(x,base=y) 

    로그 함수로 각각 밑이 자연대수 e,10,2,x 

    sign(x) 

    부호함수 

    sqrt(x) 

    제곱근 함수 

    factorial(x) 

    x의 계승 출력(x!) 

    choose(x,y) 

    x에서 y를 고르는 조합의 수 출력(xCy) 



  7. history()
    지금까지 입력한 명령을 목록으로 표시




  8. 변수에 값 저장
    변수에 값을 할당할 때 <-, <<-, = 사용




  9. 도움말
    '?' 뒤에 찾고자 하는 명령어를 입력하거나 help 형태로 입력하여 사용 할 수 있다.




  10. 디렉토리 설정
    작업하는 내용을 저장하거나 기본적으로 사용할 디렉토리를 지정하고 작업
    getwd(), setwd("C:/desktop")




  11. 패키지 사용
    INSTALL.PACKAGES("패키지명")
    install.packages() 명령어를 입력하면 mirror를 선택하는 화면이 나오는데 Korea나 희망하는 mirror를 선택




  12. 스크립트
    R console창에서 입력할때 여러 개 명령을 반복해서 입력할 때 번거롭다. 그럴 때 R 스크립트 기능을 활용한다.
    메뉴 -> 파일 -> 새 스크립트 
    R 편집기에 입력한 명령을 실행 할 때에는 블럭을 설정한 다음 CTRL+R을 누른다.
    블록 설정하지 않으면 커서가 있는 행의 명령이 실행


'Develop > R' 카테고리의 다른 글

R을 활용한 데이터 시각화  (0) 2018.01.09
R을 활용하여 데이터 처리하기  (0) 2018.01.08
R의 DataType이해  (0) 2018.01.08
R의 기본 사용법  (0) 2018.01.08

저번까지 다운로드, 업로드를 해보았습니다.

이번엔 비동기방식인 Ajax를 간단하게 알아보도록 하겠습니다.

List에서 다음 페이지를 볼려고할 때 페이지가 전환되는 것을 알 수 있었습니다.

그렇다면 페이지 전환없이 바로 다음 페이지를 보여줄 수 있게하면 어떨까요?

이것이 웹프로그램이 아닌 일반 어플리케이션을 보는 것과 같은 사용자 경험인 

RIA(Rich Internet Application)의 시작입니다.

이러한 기술들이 가능하기 위해 사용되는 것이 바로 AJAX(Asynchronous Javascript And XML)입니다.

AJAX는 Javscript를 이용한 비동기 통신, 클라이언트(브라우저)와 서버(웹서버)간에 XML 데이터를 주고 받는 기술입니다.

먼저 기존의 방식과 차이점을 그림으로 설명해보겠습니다.


그림 출처 : http://hieroglyph.tistory.com/13


기존 MVC패턴의 동작방식

요청페이지에서 요청을 날리면 웹서버에서 그에 맞는 액션을 한다음 그에 맞는 jsp페이지를 반환하면

사용자는 페이지가 전환되면서 응답페이지를 보게 됩니다.



AJAX를 사용한다면

그림과 같이 요청페이지에서 자바스크립트를 이용해 웹서버에 비동기요청을 보냅니다.

웹서버에서는 이 요청에 대한 액션을 실행한뒤 데이터를 반환하는데,

이때 자바스크립트에서 해당 응답을 받아서 돌아온 데이터들을 XML, JSON, TEXT등의 형식으로 받아서

요청 페이지의 DOM을 조작해 데이터를 보여주는 것으로 페이지 전환없이 요청에 대한 응답이 끝나게 됩니다.


간단히 말해 AJAX는 페이지 전환이 없는 웹 동작방식인겁니다.

AJAX를 이용해 실습해볼건 List에서 다음 페이지로 페이지 전환이 되는게 아니라 아래에 이어서 쭉쭉 나오게 하는것으로 실습해보겠습니다.

그러기위해서 Jquery를 사용할건데, 해드태그가 끝나기전 다음 구문을 입력해주세요. (List.jsp에)

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.js"></script>


그리고 다음페이지를 누르면 잘 요청되는지 확인을 위해 다음 구문을 넣어줍시다.

<fmt:parseNumber value="${page/10+1 }" type="number"  integerOnly="True" /> 페이지


<c:if test="${fn:length( articleList ) < 10}"> 

<a href="#">다음페이지</a>

</c:if>

<c:if test="${fn:length( articleList ) >= 10}"> 

<a href="#" onclick="loadNextPage('${page+10}')">다음페이지</a>

</c:if>

<script>

function loadNextPage(page){

var param = "page="+page;

$('#append_article').load("list.do", param, function(data){

alert(data);

});

}

</script>


<a href="write.jsp">글쓰기</a>

href = "#"은 현재페이지이며, 클릭을 하면 loadNextPage라는 함수를 실행하게 됩니다.

loadNextPage에서는 페이지를 파라미터로 받고 jquery의 selector를 이용해 위에 만든 div태그를 선택한뒤 .load함수를 

실행하게 됩니다. 세번째 인자값으로 응답 함수에 요청이 완료되어 돌아온 값을 alert으로 출력을 합니다.

한번 실행결과를 봅시다.

아래에 무언가가 하나더 생기고 alert으로 요청 값이 넘어가서 반환되는 jsp페이지가 그대로 출력되는것을 알 수 있습니다.

아 load 함수는 jquery에서 내부적으로 ajax요청이 구현되어 있는 함수입니다.

그런데 우리는 위의 결과처럼 전체 jsp페이지를 원하는게 아니고 안에 내용만 추가되는 것을 원합니다.

그래야 부하도 덜 걸리고 좀 더 깔끔해 보이겠죠.

이를 위해 ajax요청에 대비한 Action을 만들어야겠습니다.

url은 ajaxList.do

클래스 명은 AjaxListAction

AjaxListAction을 사용할려면 Command.propertis에 등록해야겠죠? 입력해줍시다.

그리고 AjaxListAction을 만들고, ListAction과 유사하기때문에 복사 붙여넣기뒤 조금 수정을 하였습니다.

그리고 데이터를 뿌려줄 ajaxList.jsp를 만들었구요. 그럼 ajaList.jsp파일을 생성해줍니다.

생성하는데 기존에 있는 body나 head부분을 다 지워주고 위의 내용만 넣을 수 있도록 합시다.


List.jsp에서 는 함수를 추가해주고요. 

<input type="hidden" name="page" id="page value="${page}"/>

는 페이지가 최초로 호출되어있을 때 딱히 보여주는게 없으므로 hidden으로 둡니다.

ajax 요청이 끝나면 페이지의 값이 변화 해야하는데

요청시에는 jquery를 통해 page input태그에 접근해 해당 input태그로부터 값을 불러와 요청을 합니다.

페이지가 로드되고 게시글들이 테이블에 append된 이후에 이때 page의 값을 마찬가지로

jquery를 통해 page input태그에 접근하여 값을 갱신합니다.

이렇게 다음 게시글을 계속 불러올때도 page에서 10이 더해져 리스트를 출력하게 됩니다.


이번에 사용한 함수는 jquery에서 ajx를 쉽게 사용할 수 있도록 구현된 ajax함수입니다.

사용법은 load함수와 유사합니다.

간단하게 ajax가 어떻게 구동되는지 알아보았습니다.

http://cusmaker.tistory.com/114

위의 블로그에서 대부분의 내용을 차용하였으며, 많은 공부가 되었습니다.
































저번 시간에는 파일 업로드까지 했습니다. 그럼 이번엔 다운로드를 해야겠죠?

다운로드도 게시판에서 빼놓을 수 없는 기능인데요.

물론 이 기능에서도 보안적인 취약점이 있습니다. 파일 다운로드 취약점으로

권한 없는 악의적인 사용자가 서버의 파일을 다운로드할 수 있는 취약점이죠.

이번 게시글에서도 보안은 신경쓰지않고 어떻게 다운로드가 되는지 흐름을 알아보기 위함입니다.

 

다운로드를 받기위해선 어떻게 해야할까요?

가장 간단한 방법은 해당 파일의 경로를 a 태그의 href에 파일이름과 명시하면 되는데

이 방법은 서버의 파일경로가 노출되므로 보안상 매우 취약합니다.

페이지 이동하는 것도 이때까지 다운로드해봤을 때 아닌거 같구요.

 

그래서 꼼수를 쓰기로했습니다.

iframe 태그를 이용하여 페이지의 redirect없이 다운로드할 수 있도록 말이죠.

iframe은 페이지속에 또다른 페이지를 표시하기 위한 태그입니다.

 

function onDownload(idx){
 var o = document.getElementById("ifrm_filedown");
 o.src = "download.do?idx="+idx;
}
</script>

</head>

<body>

<iframe id="ifrm_filedown"  style="position:absolute; z-index:1;visibility : hidden;"></iframe> 

......

  <tr>
   <th colspan="2"> 첨부파일 </th>
   <td colspan="8">
    <a href="#" onclick="onDownload('${article.idx}')">${article.filename}</a>
   </td>
  </tr>

꼼수로 iframe을 이용하여 다운로드가 될 수 있도록 하였습니다.

위에 보시면 download.do?idx=를 통해 해당 게시글의 idx를 통해 파일 이름을 가지고 올겁니다.

download.do? 보니까 무엇을 고쳐야할지 이제 감이 오시죠?

Command.properties에 추가합시다

/download.do=com.board.action.DownloadAction

그렇다면 DownloadAction도 만들어주어야죠.

간략하게 설명하자면

파일 이름을 받아서, 실제 파일이 들어있는 경로에 설정한 upload폴더와 파일이름을 붙여서

해당 스트링에서 파일을 가져오고, 파일이 존재하지 않으면 에러 처리를 합니다.

BoardDao는 content와 똑같은 기능을하기때문에 getArticle을 재사용했으며

파일 사이즈를 조사하고 content타입과 헤더를 세팅하여 파일을 출력합니다.

그리고 파일다운로드를 별도로 리턴할 페이지가 없기때문에 null로 반환합니다.

 

이제 업로드, 다운로드도 끝났습니다.

그런데 게시글을 지운다면 파일도 같이 지워져야하는데 아직 그 기능은 만들지 않았습니다.

만들어 봅시다. 게시글을 지울 때 동작하기 때문에 DeleteAction을 고치러 갑니다.

별로 길지도 않고 어렵지 않습니다.

딱 보시면 보이는 소스..

 

이로써 Model2까지 다 해보았습니다.

앞으로 Ajax를 이용하여 게시글 목록을 계속 보는것만 남았는데 그 이후(Spring)는 에러를 잡지못해서.. 추후에 해보도록 하겠습니다.

 

직접 게시판을 만들어보고 글쓰기, 삭제, 수정, 파일업로드, 다운로드 등등을 직접 만들다 보니 많은 도움이 됩니다.

웹해킹에서 주로발생하는 Sql 인젝션 파라미터변조 파일 업로드, 다운로드 취약점 등등 어떻게 발생하는지에 대해

간략적이나마 감이 오기 시작합니다.

나중에 시간이 되면 이 글에서 보안적 취약점을 조치하는 방법까지 기술하도록 해보겠습니다.

수고하셨습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+ Recent posts