StudyServer
web, server, java, spring 등.. 공부한 것을 기록하는 장소 입니다. 공부하면서 정리하였기 때문에 틀린 내용이 있을 수 있습니다. 이야기 해주시면 수정하겠습니다.

inner class(내부 클래스)

2019-03-24 00:00:00 +0000

Inner Class(내부 클래스)

  • class 안에 class를 선언하는 것
  • 내부 클래스를 감추고 싶거나 OuterClass만 InnerClass를 사용할 때 사용(코드의 복잡성 제거)
  • 서로 관련있는 클래스만 묶어줌(예를 들어 같은 회사직원이지만 회사가 다를 때 사용할 수 있다)
class OuterClass{
       private int value = 20;
       class InnerClass{
              void print() {
                     System.out.println("value:"+value);
              }
       }
}
public class Test{
       
       public static void main(String[] args) {
              OuterClass outer = new OuterClass();
              OuterClass.InnerClass inner = outer.new InnerClass();
              inner.print();
       }
}

final 키워드

2019-03-23 00:00:00 +0000

Final 정리

  • 변수에 final 키워드 사용
  • 변수의 값을 변경할 수 없음
public class Test{

	public static void main(String[] args) {
		final int value = 10;			// value 값 변경 불가
	}
}
  • 함수에 final 키워드 사용
  • 함수를 상속해서 오버라이딩 할 수 없음
class A{
	final public void print() {
		
	}
}

class B extends A{
	public void print() {	// error
		
	}
}
  • class에 final 키워드 사용
  • class를 상속할 수 없음
final class A{
	public void print() {
		
	}
}

class B extends A{
	public void print() {
		
	}
}

~~~

file upload

2019-03-20 00:00:00 +0000

파일업로드 방식

  • form 태그 사용 방식 : 브라우저 제한이 없어야 하는 경우 사용. 일반적으로 페이지 이동과 동시에 첨부파일을 업로드하는 방식
  • ajax를 이용하는 방식 : 첨부파일을 별도로 처리하는 방식

첨부파일 처리 방식

  • cos.jar : 2002년도에 개발 종료. 이제 많이 사용 안함
  • commons-fileupload : 일반적으로 많이 활용되고 서블릿 스펙 3.0 이전에도 사용 가능
  • 서블릿 3.0 이상 : 3.0 이상부터는 자체적인 파일 업로드 처리가 API 상에서 지원

스프링 첨부파일을 위한 설정

  • C드라이브 아래에 upload 폴더와 upload 폴더 아래 temp 폴더 생성
  • Spring Legacy Project 생성
  • pom.xml 버전 변경
<properties>
    <java-version>1.8</java-version>
    <org.springframework-version>5.0.7.RELEASE</org.springframework-version>
    <org.aspectj-version>1.9.10</org.aspectj-version>
    <org.slf4j-version>1.7.25</org.slf4j-version>
</properties>

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.0</version>
    <scope>provided</scope>
</dependency>
  • web.xml 변경
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  https://java.sun.com/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  • 태그 내에 태그 추가
  • max-file-size : 특정 사이즈의 메모리 사용
  • max-request-size : 업로드되는 파일의 최대 크기
  • max-size-threshold : 한번에 올릴 수 있는 최대 크기
<multipart-config>
    <location>C:\\upload\\temp</location>
    <max-file-size>20971520</max-file-size>  <!-- 1MB * 20 -->
    <max-request-size>41943040</max-request-size> <!-- 40MB -->
    <file-size-threshold>20981520</file-size-threshold><!-- 20MB -->
</multipart-config>
  • web.xml 설정은 was 자체 설정. 스프링에서 업로드 처리는 MultipartResolver 타입의 객체를 bean으로 등록해야만 가능
  • servlet-context.xml 에서 MultipartResolver bean 추가
<!-- 파일올리기 설정 -->
<beans:bean id="multipartResolver"  class="org.springframework.web.multipart.support.StandardServletMultipartResolver">
</beans:bean>
  • 여기까지 설정하고 실행 시 에러 발생
  • web-app에서 version이 중복 설정되어있어서 하나 제거
정보: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug  logging for this logger for a complete list of JARs that were scanned but no TLDs  were found in them. Skipping unneeded JARs during scanning can improve startup  time and JSP compilation time.
3월 19, 2019 9:45:43 오후 org.apache.tomcat.util.digester.Digester fatalError
심각: Parse Fatal Error at line 4 column 136: "version" 속성이 "web-app" 요소에  대해 이미 지정되었습니다.

form 방식의 업로드

  • UploadController 생성
@Controller
public class UploadController {
       @GetMapping("/uploadForm")
       public void uploadForm() {
              System.out.println("upload form");
       }
}
  • uploadForm.jsp 생성
<form action="uploadFormAction" method="post" enctype="multipart/form-data">
<input type='file' name='uploadFile' multiple>
<button>Submit</button>
</form>
  • 스프링 MVC에는 MultipartFile 타입을 제공해서 업로드되는 파일 데이터를 쉽게 처리할 수 있음.
  • 파일 처리는 MultipartFile 타입 사용
  • 여러개의 첨부파일을 첨부할 수 있으므로 배열로 설정
  • 파일이름이 한글일 때 처리x 영어만 할 것
@PostMapping("/uploadFormAction")
       public void uploadFormPost(MultipartFile[] uploadFile, Model model) {
              String uploadFolder = "C:\\upload";
              for(MultipartFile multipartFile : uploadFile) {
                     System.out.println("----------------------------");
                     System.out.println("Upload File  Name:"+multipartFile.getOriginalFilename());
                     System.out.println("Upload File  Size:"+multipartFile.getSize());  
                     
                     File saveFile = new File(uploadFolder,  multipartFile.getOriginalFilename());
                     try {
                           multipartFile.transferTo(saveFile);             //  업로드 되는 파일 저장
                           
                     }catch(Exception e) {
                           
                     }
              }
       }

Ajax 방식의 업로드

  • Ajax 이용 시 첨부파일 처리는 FormData 객체 사용
  • FormData는 가상의 <form>태그와 같다고 생각하면 된다
  • uploadAjax.jsp 생성
<h1>Upload with Ajax</h1>
<div class='uploadDiv'>
	<input type='file' name='uploadFile' multiple>
</div>

<button id='uploadBtn'>Upload</button>

<script src="http://code.jquery.com/jquery-3.3.1.min.js" 
integrity="sha2560FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="crossorigin="anonymous"></script>
<script>
$(document).ready(function(){
	$("#uploadBtn").on("click", function(e){
		var formData = new FormData();
		var inputFile = $("input[name='uploadFile']");
		var files = inputFile[0].files;
		console.log(files);
		
		// add filedate to formdata
		for(var i = 0; i < files.length; ++i){
			formData.append("uploadFile", files[i]);
		}
		
		$.ajax({
			url: '/uploadAjaxAction',
			processData: false,
			contentType: false,
			data: formData,
			type: 'POST',
			success: function(result){
				alert("Uploaded");
			}
		});	// ajax
	});
});
</script>
  • ajaxUpload 처리 Controller에 추가
@GetMapping("/uploadAjax")
public void uploadAjax() {
   System.out.println("upload ajax");
}
       
@PostMapping("/uploadAjaxAction")
public void uploadAjax(MultipartFile[] uploadFile) {
    String uploadFolder = "C:\\upload";
    for(MultipartFile multipartFile : uploadFile) {
        System.out.println("----------------------------");
        System.out.println("Upload File  Name:"+multipartFile.getOriginalFilename());
        System.out.println("Upload File  Size:"+multipartFile.getSize());  
                     
        File saveFile = new File(uploadFolder,  multipartFile.getOriginalFilename());
        try {
                           multipartFile.transferTo(saveFile);             //  업로드 되는 파일 저장
                           
        }catch(Exception e) {
                           
        }
    }
}

파이썬 빅 데이터 K-평균(K-means)

2019-03-17 00:00:00 +0000

파이썬 빅 데이터 K-평균(K-means)

  • 대표적인 클러스터링 알고리즘
  • 클러스터링(Clustering)이란 여러 개의 데이터가 있을 때 데이터를 묶는 것
  • 예를 들어 학원에서 고급반, 중급반, 초급반으로 나누면 데이터 활용 방안이 많아진다
  • 비지도 학습 알고리즘
  • 여러개의 데이터가 있을 때 거리가 가까운 데이터를 선택하는 것(고급반, 중급반, 초급반 중 하나)
  • 그리고 데이터를 중심값으로 옮겨준다. 그리고 또 비교하고.. 완벽한 중심값을 찾을 때 까지 반복한다.
  • K-means 플러시플러시는 이미 선택된 중심점들로부터 가장 멀리 있는 노드가 중심이 됨.
  • 파이썬 빅 데이터 분석에서 많이 사용되는 라이브러리는 팬더스(Pandas), 넘파이(Numpy), 맷플랏라이브러리(Matplotlib)
  • Numpy : 연산처리를 용이하게 함
  • Pandas : 데이터 포인트를 만들기 위해 사용
  • Matplotlib : 데이터 시각화를 위해 사용
from sklearn.cluster import KMeans
import numpy as np
import pandas as pd
import seaborn as sb
import matplotlib.pyplot as plt
%matplotlib inline
df = pd.DataFrame(columns=['x', 'y'])
df.loc[0] = [2,3]
df.loc[1] = [2,11]
df.loc[2] = [2,18]
df.loc[3] = [4,5]
df.loc[4] = [4,7]
df.loc[5] = [5,3]
df.loc[6] = [5,15]
df.loc[7] = [6,6]
df.loc[8] = [6,8]
df.loc[9] = [6,9]
df.loc[10] = [7,2]
df.loc[11] = [7,4]
df.loc[12] = [7,5]
df.loc[13] = [7,17]
df.loc[14] = [7,18]
df.loc[15] = [8,5]
df.loc[16] = [8,4]
df.loc[17] = [9,10]
df.loc[18] = [9,11]
df.loc[19] = [9,15]
df.loc[20] = [9,19]
df.loc[21] = [10,5]
df.loc[22] = [10,8]
df.loc[23] = [10,18]
df.loc[24] = [12,6]
df.loc[25] = [13,5]
df.loc[26] = [14,11]
df.loc[27] = [15,6]
df.loc[28] = [15,18]
df.loc[29] = [18,12]

df.head(30) # 표로 나타내기

sb.lmplot('x', 'y', data=df, fit_reg=False, scatter_kws={"s": 100}) # 데이터 시각화
plt.title('K-means Example')
plt.xlabel('x')
plt.ylabel('y')

# 클러스터링
points = df.values 
kmeans = KMeans(n_clusters=4).fit(points)
kmeans.cluster_centers_

kmeans.labels_

df['cluster'] = kmeans.labels_
df.head(30)

sb.lmplot('x', 'y', data=df, fit_reg=False, scatter_kws={"s": 150}, hue="cluster")# 데이터 시각화, 색상도 변화
plt.title('K-means Example')

아나콘다(Anaconda), 주피터 개발환경 세팅

2019-03-16 00:00:00 +0000

아나콘다, 주피터 개발환경 구축

선형 회귀 인공지능 구현

  • x가 값이 올라갈 수록 y데이터가 상승한다
  • 이것을 수식에 대입하여 x값이 8일 때 y값을 추측할 수 있다
import tensorflow as tf
xData = [1,2,3,4,5,6,7]
yData = [25000, 55000, 75000, 110000, 128000,155000, 180000]
W = tf.Variable(tf.random_uniform([1], -100, 100))
b = tf.Variable(tf.random_uniform([1], -100, 100))
X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)
H = W * X + b  # 수식
cost = tf.reduce_mean(tf.square(H-Y)) # 예측값에서 실제값을 뺀 제곱
a = tf.Variable(0.01) # 경사하강 알고리즘에서 얼마만큼 점프를 하는지
optimizer = tf.train.GradientDescentOptimizer(a) # 텐서플로서에서 제공해주는 경사하강 라이브러리
train = optimizer.minimize(cost)
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
for i in range(5001):
    sess.run(train, feed_dict={X: xData, Y:yData})
    if i % 500 == 0 :
        print(i, sess.run(cost, feed_dict = {X:xData, Y:yData}), sess.run(W), sess.run(b))

print(sess.run(H, feed_dict={X:[8]})) # x가 8일 때 결과값 출력

아나콘다(Anaconda), 주피터 개발환경

  • 콘솔보다 효율적인 개발환경 구축 필요

다운로드

  • https://www.anaconda.com/distribution/
  • window 64bit 다운로드 및 설치
  • 설치 시 한글 경로x 그 외 기본 설정으로 next만 누르면 된다
  • 설치 시간은 20분 정도 걸린다
  • 아래 명령어를 cmd창에 치고 만약 list가 적다면 이전에 설치한 python과 충돌나는 것일 수 있기 때문에 anaconda 설치 경로로 Path를 변경해야한다
  • Path는 사용자 변수를 설정해야 하고 2개의 경로를 지정해야한다 \Anaconda3\ , Anaconda3\Scripts\
python -m pip list --format=legacy
  • list 확인 후 tensorflow를 설치
pip install tensorflow
  • jupyter 실행. 가상의 서버를 만들고 python을 실행시킬 수 있는 gui 툴 제공
jupyter notebook
  • 텐서플로우 예제 실행. No module named ‘numpy.core._multiarray_umath’ 에러 남. 원인은 python 3.6버전이라서 텐서플로우 버전을 1.12로 맞춰줘야 한다
  • 기존 텐서플로우 삭제 및 1.12.0 버전으로 실행하니 실행이 잘 되었다.
python -m pip uninstall tensorflow
python -m pip install tensorflow==1.12.0

Posts

subscribe via RSS