반응형

▶ 웹 프로그래밍의 여러가지 구성 요소 

 

웹 서버 : 각 클라이언트에게 서비스를 제공하는 컴퓨터

클라이언트 : 네트워크로 서버에 접속한 후 서버로부터 서비스를 제공받는 컴퓨터

HTTP 프로토콜 : Hyper Text Transfor Protocol의 약자로, www 서비스를 제공하는 통신규약

HTML : Hyper Text Markup Language의 약자로, www 서비스를 제공하기 위한 표준 언어

자바스크립트 : HTML 웹 페이지의 여러가지 동적인 기능을 제공하는 스크립트 언어

CSS(Style Sheet) : HTML 문서에서 서체나 색상, 정렬 등 세부적인 HTML 페이지의 디자인에 관련된 여러가지 기능 제공

 

 

 

▶ 정적 웹 프로그래밍 

 

˙특징?

  ① 사용자에게 고정된 정보만 제공 

  ② 정보 수정 시 관리자가 직접 HTML 소스를 수정하여 사용자에게 정보 제공

 

 

 

▶ 동적 웹 프로그래밍 

˙특징?

클라이언트의 요청이 있을 때마다 DB에 접근하여 실시간 정보를 클라이언트에게 제공

 

처음으로 동적인 방식으로 프로그램을 제공하는 기능은 CGI(Common Gate Interface, 공용 게이트웨이 인터페이스) 이었다.

˙CGI의 특징?

① 초기 웹 프로그램에서 사용하는 방식

② 프로세스 방식으로 실행

서버의 부하 심함 → 이러한 문제로 나온 것이 JSP, ASP, PHP와 같은 동적 웹 프로그래밍 기술

 

 

 

▶ JSP 

˙JSP의 특징?

프로세스 방식이 아닌 스레드 방식으로 실행

클라이언트의 요구를 처리하는 기능은 최초 한번만 메모리에 로드

클라이언트가 동일한 기능을 요구하면 기존에 사용한 기능을 재사용

 

반응형
반응형

▶ JSP (Java Server Page , 자바 서버 페이지)란? 

 

웹 브라우저를 통해 인터넷에 접속하고, 그 홈페이지에서 어떤 요소를 클릭하여 다른 웹페이지로 이동하게 된다.

대부분 미리 서버에 등록해 두었다가 웹 브라우저가 서버에 특정 데이터를 요청하면 이를 웹 브라우저로 전송하여 보여준다.

이를 가능하게 하는 기술 중 하나이다.

 

 

 

▶ 프로그램 발전 과정 

 

˙클라이언트 PC 기반 프로그램의 문제점?

① 프로그램에 기능이 추가되거나 자주 변경되면 수시로 사용자 PC마다 프로그램을 업데이트 또는 새로 설치해야 함

② 프로그램에 정보가 들어있다면 정보가 쉽게 노출될 수 있어 보안에 취약함

 

→ 문제점을 해결하기 위해 등장 한 것이 클라이언트 - 서버 기반 프로그램

 

 

 

▶ 클라이언트 - 서버 기반 프로그램   

 

기존 클라이언트가 수행하는 모든 기능을 서버에서 수행

따라서 클라이언트는 처리할 데이터를 서버에 전달하고, 서버가 처리한 결과를 받아 화면에 출력하는 역할만 수행

 

클라이언트-서버 프로그램은 기능이 변경되어도 모두 서버에서 처리하면 되기 때문에 클라이언트 프로그램을 수정할 필요가 없고 보안도 우수

 

˙클라이언트 - 서버 기반 프로그램의 한계?

기능만 변경하는 것 쉽게 가능하지만, 화면 변경 시에는 추가 작업 필요

 

 

 

▶ 웹 기반 프로그램   

사용자가 사용하는 프로그램의 기능이나 화면이 바뀌면 서버에서 모두 처리

따라서 클라이언트가 특별히 수행해야 할 작업이 없고, 모든 기능을 서버에서 처리하므로 보안 우수

 

 → JSP, ASP, PHP 같은 웹 기술 + 데이터베이스 연동 시 실시간으로 클라이언트 요청 처리 가능 

반응형
반응형

▶  참고 지식  ◀

 

https://ko.wikipedia.org/wiki/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C_%ED%98%B8%EC%A0%9C%EB%B2%95

 

유클리드 호제법 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 유클리드 호제법(-互除法, Euclidean algorithm) 또는 유클리드 알고리즘은 2개의 자연수 또는 정식(整式)의 최대공약수를 구하는 알고리즘의 하나이다. 호제법이란

ko.wikipedia.org

 

▶  문제 설명  ◀

 

두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요.

배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다.

예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.

 

 

▶  제한 사항  ◀

 

˙두 수는 1이상 1000000이하의 자연수입니다.

 

class Solution {
    public int[] solution(int n, int m) {
        int[] answer = new int[2];
        int num1 = 0;
        int num2 = 0;
        if(n>m){
        	num1 = n;
        	num2 = m;
        }else{
        	num1 = m;
        	num2 = n;
        }
        
    	int div1 = num1; 
    	int div2 = num2; 
    	while(true){
    		if(div1%div2 == 0){
    			answer[0] = div2;
    			break;
    		}
    		int temp = div1;
    		div1 = div2;
    		div2 = temp%div2;
    		
    	}
        	
        answer[1] = num1 * num2 / answer[0];
        return answer;
    }
    
}
반응형
반응형

▶  문제 설명  ◀

 

사용언어 : JAVA

 

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다.

다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다.

학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다.

예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다.

체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.

전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost,

여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때,

체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.

 

 

▶  제한 사항  ◀

 

˙전체 학생의 수는 2명 이상 30명 이하입니다.

˙ 체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.

˙ 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.

˙ 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.

˙ 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다.

     이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.

 

class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
    	int answer = n - lost.length;
    	
    	for(int i=0; i<reserve.length; i++){
    		for(int j=0; j<lost.length; j++){
    			if(reserve[i] == lost[j]){
    				reserve[i] = -1;
    				lost[j] = -1;
    				answer += 1;
    				break;
    			}
    		}
    	}
    	
    	for(int i=0; i<reserve.length; i++){
    		for(int j=0; j<lost.length; j++){
    			if(reserve[i] - 1 == lost[j] || reserve[i] + 1 == lost[j]){
    				answer++;
    				reserve[i] = -1;
    				lost[j] = -1;
    			}
    		}
    	}
        return answer;
    }
}
반응형
반응형

안녕하세요. 오늘은 파이썬과 Oracle을 이용하여 데이터 베이스를 가져오는 방법을 소개해드리겠습니다.

 

 

˙사전 준비 

 

Oracle 에서 접속할 계정의 이름 비밀번호, 호스트 이름, 포트번호, SID를 알고 있어야 합니다.

 

 

 

˙테이블 정보 

 

<TABLE1>

저는 이름이 TABLE1인 테이블을  가지고 오겠습니다.

 

 

 

˙코드 설명 

 

import cx_Oracle 

sql =   """
        select col1, col2 
        from table1
        """
conn = cx_Oracle.connect('python/python@localhost:1521/xe')
# conn = cx_Oracle.connect('접속이름/비밀번호@호스트이름:포트번호/SID)
cs = conn.cursor()
rs = cs.execute(sql)

cx_Oracle 모듈을 import 하고 sql 에 자신이 실행하고 싶은 sql 문장을 적습니다.

그 후 Oracle과 접속하여 sql문을 실행합니다.

 

col1 = []
col2 = []

for record in rs:
    col1.append(record[0])
    col2.append(record[1])
print("col1 : ", col1)
print("col2 : ", col2)

sql 결과를 for문을 이용하여 가져옵니다.

이때 컬럼 별로 정보를 저장하고 싶으면 배열에 각각 저장 할 수 있습니다.

 

 

 

˙실행 결과 

 

각각의 컬럼의 정보가 배열에 담긴 것을 확인할 수 있습니다.

 

 

 

˙전체 코드 

 

import cx_Oracle 

sql =   """
        select col1, col2 
        from table1
        """
conn = cx_Oracle.connect('python/python@localhost:1521/xe')
cs = conn.cursor()
rs = cs.execute(sql)

col1 = []
col2 = []

for record in rs:
    col1.append(record[0])
    col2.append(record[1])
print("col1 : ", col1)
print("col2 : ", col2)

 

반응형
반응형

▶  문제 설명  ◀

 

사용언어 : JAVA

 

행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다.

2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.

 

▶  제한 사항  ◀

 

˙행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다.

 

import java.util.ArrayList;
class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
    	int[][] answer = new int[arr1.length][arr1[0].length];

    	for(int i=0; i<arr1.length; i++){
    		ArrayList<Integer> temp = new ArrayList<Integer>();
    		
    		for(int j=0; j<arr1[i].length; j++){
    			int a = arr1[i][j] + arr2[i][j];
    			answer[i][j] = a;
    		}
    		
       	}
		return answer;
    }
}

 

반응형
반응형

 

안녕하세요. 오늘은 파이썬을 통해 이메일 보내는 법을 소개해드리겠습니다.

 

 

˙사전준비 

 

저는 네이버 계정을 사용하였는데 먼저 메일로 들어가서 하단의 환경설정으로 들어갑니다.

그 후 POP3/IMAP 설정 으로 들어가 사용함으로 체크해줍니다.

 

 

 

˙코드 설명 

 

import smtplib                             
from email.mime.text import MIMEText

먼저 메일을 보내기 위한 SMTP 모듈을 import 해줍니다.

 

smtpName = "smtp.naver.com"                 
smtpPort = smtp 포트 번호                          

sendEmail = "나의 네이버 계정"
password = "나의 네이버 비밀번호"
recvEmail = "받는 사람 이메일"

 

아까 환경설정을 해주었던 네이버 메일 페이지 하단에 보면 smtp 포트 번호를 적어주시고,

보내는 사람, 비밀번호, 받는 사람을 적어주시면 됩니다.

 

title = "파이썬~~"                                 
content = "안녕하세용"                                

메일의 제목과 내용을 입력합니다.

 

msg = MIMEText(content)                       
msg['From'] = sendEmail
msg['To'] = recvEmail
msg['Subject'] = title

읽어들인 파일의 텍스트를 MIME 객체화 합니다.

 

s = smtplib.SMTP(smtpName , smtpPort)         
s.starttls()                                  
s.login(sendEmail , password)                 
s.sendmail(sendEmail, recvEmail, msg.as_string())  
s.close()                                     

메일 서버로 연결 후 이메일을 보내고, 서버 연결을 종료합니다.

 

받는 사람의 메일로 가보면 성공적으로 전송된 것을 확인하실 수 있습니다.

 

 

 

˙전체 코드 

import smtplib                             
from email.mime.text import MIMEText

smtpName = "smtp.naver.com"                  
smtpPort = 포트번호                              

sendEmail = "나의 네이버 계정"
password = "나의 네이버 비밀번호"
recvEmail = "받는 사람 이메일"

title = "파이썬~~"                                
content = "안녕하세용"                                

msg = MIMEText(content)                      
msg['From'] = sendEmail
msg['To'] = recvEmail
msg['Subject'] = title                   

s = smtplib.SMTP(smtpName , smtpPort)         
s.starttls()                                
s.login(sendEmail , password)                 
s.sendmail(sendEmail, recvEmail, msg.as_string()) 
s.close()                                     
반응형
반응형

안녕하세요! 오늘은 tesseract를 이용하여 자동차 번호판을 인식하는 방법입니다.

준비과정이 필요하신 분들은 전 글을 참고하시면 됩니다.

 

maxtime1004.tistory.com/37

 

[PYTHON] tesseract를 이용한 자동차 번호판 인식기 - 1

안녕하세요! 오늘은 tesseract를 이용하여 자동차 번호판을 인식하는 방법입니다. 저는 아래의 영상을 통해 도움을 얻었고 해당 영상에도 링크에 깃허브 주소가 있으니 참고하실 분들은 아래 링크

maxtime1004.tistory.com

 

 

˙ 코드 및 실행 결과 

 

전체 코드는 더 많은 내용을 담고 있기 때문에 대략적으로 간단히만 설명 드리겠습니다. 전체 코드는 아래 깃허브에서 확인하실 수 있습니다.

github.com/dpwls64/tesseract_project

 

dpwls64/tesseract_project

Contribute to dpwls64/tesseract_project development by creating an account on GitHub.

github.com

 

1. 자동차 번호판 위치 알아내기

 

- 원본 이미지

 

- 이미지 흑백화

gray = cv2.cvtColor(img_ori, cv2.COLOR_BGR2GRAY)

 

- 가우시안 블러 : 노이즈 줄이기

img_blurred = cv2.GaussianBlur(gray, ksize=(5, 5), sigmaX=0)

 

- 스레시 홀드 : 이미지 구별 쉬움 (흑색, 흰색)

img_thresh = cv2.adaptiveThreshold(
    img_blurred, 
    maxValue=255.0, 
    adaptiveMethod=cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
    thresholdType=cv2.THRESH_BINARY_INV, 
    blockSize=19, 
    C=9
)

가우시안 블러를 이용하여 이미지를 흐릿하게 만들어 노이즈를 줄여주고,

스레시 홀드를 이용하여 이미지를 검정색, 흰색으로만 표현하여 컴퓨터가 구별하기 쉽게 만들어 줍니다.

 

 

- 윤곽선 찾기

contours, _ = cv2.findContours(
    img_thresh, 
    mode=cv2.RETR_LIST, 
    method=cv2.CHAIN_APPROX_SIMPLE
)

 

- 윤곽선 중 사각형 찾기

for contour in contours:
    x, y, w, h = cv2.boundingRect(contour)
    cv2.rectangle(temp_result, pt1=(x, y), pt2=(x+w, y+h), color=(255, 255, 255), thickness=2)

찾은 사각형 중에서 점차적으로 번호판과 가깝다고 생각하는 사각형들을 찾습니다.

 

- 번호판 각도 돌리기

 rotation_matrix = cv2.getRotationMatrix2D(center=(plate_cx, plate_cy), angle=angle, scale=1.0)
 img_rotated = cv2.warpAffine(img_thresh, M=rotation_matrix, dsize=(width, height))

비뚤어져 있는 번호판을 일자로 되도록 돌리고, 이미지를 더 선명하게 해줍니다.

2. 번호판 글자 인식하기 (tesseract)

chars = pytesseract.image_to_string(img_result, lang='kor', config='--psm 7 --oem 0')

result_chars = ''
has_digit = False
for c in chars:
if ord('가') <= ord(c) <= ord('힣') or c.isdigit():
if c.isdigit():
has_digit = True
result_chars += c

숫자와 한글로 이미지를 인식하여 결과를 추출합니다.

반응형

+ Recent posts