반응형

Python socket programming



Python socket programming

1. Python : Socket Program Produced by Tae Young Lee

2. 클라이언트/서버 아키텍처 서버가 하나 이상의 클라이언트(사용자)에게 '서비스'를 제공 listen

3. Socket • 소켓은 '통신 종단점'이라는 개념을 구체화한 컴퓨터 네트 워크 데이터 구조 • 네트워크를 사용하는 애플리케이션은 통신을 시작하기 전 에 항상 소켓을 만들어야 함 • 소켓 없이는 통신을 시작할 수 없음 • 원래 소켓은 실행중인 프로그램(프로세스)이 같은 호스트 안에 실행 중인 다른 프로그램과 통신하기 위해 개발됨

4. Socket 유형 • 유닉스 소켓 – AF_UNIX 라는 '패밀리 이름' 을 가진다. AF는 주소 패밀리(Address family)를 의미. – 쉽게 클라이언트와 서버가 유닉스 환경의 동일한 컴퓨터에 존재해야 한다는 뜻. – 이 소켓은 파일 기반이다. 소켓의 기반 구조가 파일 시스템을 통해 지원됨 – 파일 시스템은 같은 호스트에서 실행 중인 프로세스 사이에 지속적으 로 공유되므로, 합리적인 방법이라고 할 수 있다. • 네트워크 기반 – 패밀리 이름은 AF_INET 이다. – 클라이언트와 서버가 인터넷 어디서든 존재할 수 있다는 의미를 갖는 다 • 파이썬은 AF_UNIX, AF_NETLINK, AF_TIPC, AF_INET{,6} 패 밀리를 지원

5. 연결 방식에 따른 분류 • 연결 지향 소켓(connection oriented) – 통신을 하기 전에 반드시 연결 돼 있어야 한다(전화를 거는 것과 유사) – 레코드 경계 없이 데이터를 순서대로 신뢰성 있게 중복없이 전 달. 각 메세지는 여러 조각으로 나뉘어서 반대편에 확실히 전달 된 다음에 다시 순서대로 한데 묶인 후 기다리는 애플리케이션 에 전달 – 연결 지향 소켓을 구현한 프로토콜(protocol)로는 전송 제어 프 로토콜(TCP, Trasmission Control Protocol) 이 있으며, 이 소켓을 만드려면 소켓 유형으로 SOCK_STREAM(스트림 소켓)을 지정 – 이 소켓은 네트워크상에서 IP를 호스트를 찾기 위해 사용하기 때 문에 두 프로토콜의 이름을 붙여 TCP/IP 라고 함.

6. • 비연결형 소켓(connectionless) – 스트림 소켓과 대비되는 데이터그램(Datagram) 유형의 비연결 – 통신 시 최초 연결하는 과정이 필요 없음 – 데이터 전달 과정에서 순서나 신뢰성 이나 중복 방지를 보장할 수 없음. 이는 메세지가 연결 지향 소켓처럼 조각으로 나뉘지 않 고 통째로 송신된다는 것을 의미(우편 서비스에 비유) – 연결 지향 소켓은 가상 회선을 맨 처음 만들고 유지하기 위해 상 당한 부가 비용이 발생 비연결 지향 소켓은 이런 부담이 덜하고 성능면에서 더 좋다. – 데이터그램 소켓을 구현한 프로토콜로는 (UDP, User Datagram Protocol)이 있고, UPD 소켓을 만들려면 SOCK_DGRAM을 소켓 유형으로 지정. – 이 소켓도 IP를 네트워크상에서 호스트를 찾기 위해 사용 UPD/IP라고도 부름

7. Socket의 동작 과정

8. conn.close() from socket import * svrsock = socket(AF_INET, SOCK_STREAM)

9. conn.close() from socket import * svrsock = socket(AF_INET, SOCK_STREAM) svrsock.bind(('127.0.0.1', 7799))

10. conn.close() from socket import * svrsock = socket(AF_INET, SOCK_STREAM) svrsock.bind(('127.0.0.1', 7799)) svrsock.listen(1)

11. conn.close() from socket import * svrsock = socket(AF_INET, SOCK_STREAM) svrsock.bind(('127.0.0.1', 7799)) svrsock.listen(1) conn, addr = svrsock.accept() addr ('127.0.0.1', 50933)

12. conn.close() from socket import * svrsock = socket(AF_INET, SOCK_STREAM) svrsock.bind(('127.0.0.1', 7799)) svrsock.listen(1) conn, addr = svrsock.accept() addr ('127.0.0.1', 50933) conn.recv(1024)

13. conn.close() from socket import * svrsock = socket(AF_INET, SOCK_STREAM) svrsock.bind(('127.0.0.1', 7799)) svrsock.listen(1) conn, addr = svrsock.accept() addr ('127.0.0.1', 50933) conn.recv(1024) conn.close()

14. conn.close() from socket import * clientsock = socket(AF_INET, SOCK_STREAM)

15. conn.close() from socket import * clientsock = socket(AF_INET, SOCK_STREAM) clientsock.connect(('127.0.0.1',7799))

16. conn.close() from socket import * clientsock = socket(AF_INET, SOCK_STREAM) clientsock.connect(('127.0.0.1',7799)) clientsock.send('Hi, it is me.')

17. Blocking & Non-Blocking • blocking 모드일 때 accept, recv, send 호출할 때 연결하려 고 하는 client 가 없을 때 무한정 기다리는 것 • non-blocking 모드일 때는 위와 같은 상황에서 일정한 시 간을 기다려도 응답이 없을 때 예외가 발생

18. • https://pl.python.org/docs/lib/socket-objects.html • setblocking(flag) Set blocking or non-blocking mode of the socket: if flag is 0, the socket is set to non- blocking, else to blocking mode. Initially all sockets are in blocking mode. In non- blocking mode, if a recv() call doesn't find any data, or if a send() call can't immediately dispose of the data, a error exception is raised; in blocking mode, the calls block until they can proceed. s.setblocking(0) is equivalent to s.settimeout(0); s.setblocking(1) is equivalent to s.settimeout(None). • settimeout(value)Set a timeout on blocking socket operations. The value argument can be a nonnegative float expressing seconds, or None. If a float is given, subsequent socket operations will raise an timeout exception if the timeout period value has elapsed before the operation has completed. Setting a timeout of None disables timeouts on socket operations. s.settimeout(0.0) is equivalent tos.setblocking(0); s.settimeout(None) is equivalent to s.setblocking(1). New in version 2.3. • gettimeout()Return the timeout in floating seconds associated with socket operations, or None if no timeout is set. This reflects the last call tosetblocking() or settimeout(). New in version 2.3. 위와 같이 기본적으로는 blocking 모드이다. non-blocking mode를 이용하려면 setblocking(flag)을 이용해 non- blocking mode 로 가거나 아니면 settimeout 을 이용해 non-blocking mode 로 전환하면 된다.

19. 위와 같이 socket 객체를 생성하고 gettimeout을 하면 처음에 아무 것도 볼 수 없음 blocking mode (default) 이므로 값이 무한대임을 의미 그 다음에 setblocking() 을 이용해 non-blocking mode로 변환한 후 gettimeout을 호출하면 0.0 이 나옴 non-blocking mode의 default time out value는 0.0 임

20. 위의 상황에서 생성된 socket 객체를 제거하고 다시 socket을 생성하면 default 이므로 blocking mode 임을 확인 (gettimeout) 여기서 setblocking 을 이용하지 않고 바로 settimeout 을 이용해도 원하는 timeout을 시간을 가진 non-blocking mode 로 변환되는 것을 확인

21. Example • 다음은 blocking mode 의 간단한 예제이다. Server 측 : localhost connection 이고 8000 port 를 binding 한 후 accept 함수를 호출해 client 와의 connection을 기다리고 있다.

22. • Client 측 : non-blocking mode 이고 timeout 이 3.5 초이 다. connect 을 통해 서버와 연결 된 후 non-blocking mode로 변환되고, recv 를 통해 3.5 초간 서버로부터의 데 이터 전송을 기다리다가 예외를 발생시킨다.

.

반응형
반응형

codecademy.com python 100% complete.



반응형
반응형

텐서플로(Tensorflow) 시작하기


https://gist.github.com/haje01/202ac276bace4b25dd3f



소개

텐서플로우(TensorFlow)는 기계 학습과 딥러닝을 위해 구글에서 만든 오픈소스 라이브러리입니다. 데이터 플로우 그래프(Data Flow Graph) 방식을 사용하였습니다.

데이터 플로우 그래프

데이터 플로우 그래프는 수학 계산과 데이터의 흐름을 노드(Node)와 엣지(Edge)를 사용한 방향 그래프(Directed Graph)로 표현합니다.

data flow graph

노드는 수학적 계산, 데이터 입/출력, 그리고 데이터의 읽기/저장 등의 작업을 수행합니다. 엣지는 노드들 간 데이터의 입출력 관계를 나타냅니다.

엣지는 동적 사이즈의 다차원 데이터 배열(=텐서)을 실어나르는데, 여기에서 텐서플로우라는 이름이 지어졌습니다.

텐서(Tensor)는 과학과 공학 등 다양한 분야에서 이전부터 쓰이던 개념입니다. 수학에서는 임의의 기하 구조를 좌표 독립적으로 표현하기 위한 표기법으로 알려져 있지만, 분야마다 조금씩 다른 의미로 사용됩니다. 여기에서는 학습 데이터가 저장되는 다차원 배열 정도로 이해하시면 되겠습니다.

특징

텐서플로우는 다음과 같은 특징을 가집니다:

  • 데이터 플로우 그래프를 통한 풍부한 표현력
  • 코드 수정 없이 CPU/GPU 모드로 동작
  • 아이디어 테스트에서 서비스 단계까지 이용 가능
  • 계산 구조와 목표 함수만 정의하면 자동으로 미분 계산을 처리
  • Python/C++를 지원하며, SWIG를 통해 다양한 언어 지원 가능

이후의 설명은 Python을 중심으로 진행하겠습니다. (pip를 통한 Python3설치는 개발 중으로, Python2 기반으로 하겠습니다.)

"구글이 텐서플로우를 오픈소스로 한 것은, 기계 학습이 앞으로 제품과 기술을 혁신하는데 가장 필수적인 요소라고 믿기 때문입니다." - Google Brain Team

설치

텐서플로우는 설치가 비교적 쉬운 편입니다만, 다음과 같은 제약이 있습니다:

  • Unix계열 OS(Linux/Mac OSX)만 지원합니다.
  • GPU 버전은 Linux만 지원합니다.

Linux / Mac OSX

Unix 계열 OS를 사용하시는 분들은 공식 페이지의 설치 문서를 참고하시면 쉽게 설치할 수 있습니다.

윈도우

윈도우 사용자 분들은 가상 머신을 이용하거나, 도커 툴박스 설치 후 진행하시기 바랍니다.

이미지를 받고 컨테이너 실행

텐서플로우의 도커 이미지는 소스코드, 예제, 툴도 포함되어 있기에 풀 버전을 받는 것을 권합니다.

Linux / Mac OSX

Unix 계열 OS에서는 아래의 명령을 실행하면 이미지를 받고 컨테이너가 실행됩니다. 컨테이너 실행 후 자동으로 컨테이너 안의 쉘 환경으로 들어가게 됩니다.

docker run -it b.gcr.io/tensorflow/tensorflow-full

컨테이너 안의 /tensorflow 폴더에 소스가 설치되어 있습니다. (주의: 이 폴더에서 모듈을 import 하시면 에러가 발생합니다. )

윈도우

윈도우의 경우 Docker QuickStart Terminal 실행 후(이때 고래 그림 아래의 IP를 기억해 둡니다) 아래와 같이 실행하시기 바랍니다.

winpty docker run -it -p 8888:8888 b.gcr.io/tensorflow/tensorflow-full

이미지를 받은 후 컨테이너가 실행되면, Jupyter 노트북 서버가 자동으로 시작된 상태입니다. 웹브라우저에서 '위의IP:8888'을 입력하면 Jupyter Notebook 환경에 접속됩니다. 여기에서 tensorflow를 사용하실 수 있습니다.

동작 확인

설치가 잘 되었는지 다음의 코드로 확인해봅니다.

$ python

>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print sess.run(hello)
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print sess.run(a+b)
42
>>>

.

반응형
반응형

문자열을 반복하여 붙이는 3가지 코딩 방법 및 수행 시간 비교


[코드 1]
import time
start_time = time.time()
s = ''
for k in range(1000000):
    s += 'python'
end_time = time.time()
print end_time - start_time

출력: 0.243875980377

[코드 2]
start_time = time.time()
t = []
for k in range(1000000):
    t.append('python')
s = ''.join(t)
end_time = time.time()
print end_time - start_time

출력: 0.161774158478

[코드 3]
start_time = time.time()
s = 'python' * 1000000
end_time = time.time()
print end_time - start_time

출력: 0.000773191452026

위 결과로 알 수 있듯이 단순하게 문자열을 반복하여 붙이는 코딩 방법은 3번째 방식의 효율이 가장 좋습니다.

 

 

파이썬 온라인 코딩 학습 사이트 추천

 

https://www.codecademy.com/ko/tracks/python-ko 


온라인 코딩 학습 사이트로 유명한 codecademy의 Python 학습 컨텐츠입니다. 

한글로 친절하게 번역이 잘 되어 있으며, 

각 단계별로 실제 코딩을 하여야 다음 단계로 넘어갈 수 있기 때문에 

파이썬을 학습하기에 아주 좋은 사이트입니다.

 

 

파이썬으로 개발된 유명한 S/W에는 어떤 것이 있을까요?
아래 링크에서 확인할 수 있습니다.


위 링크의 내용에 나와 있듯이 Youtube도 Python으로 개발되었습니다.

 

 

 

반응형
반응형

윈도우즈에 파이썬 개발 환경 구축 참고 자료 


Python Korea 2014년 6월 세미나 - Windows 환경에서 Python 개발환경 세팅하기

 


http://www.slideshare.net/JoongiKim/python-korea-20140628-windows-python

 


처음에 윈도우즈에서 개발환경을 구축할 때 도움이 될 만한 자료입니다.

 

[turtle 모듈 활용하기]


1) 참고자료


2) 예제

import turtle

t = turtle.Turtle()
t.pensize(3)             # 펜 사이즈를 3으로 설정한다.
t.penup()                # 펜을 종이로 부터 들어올린다.
t.goto(-200, -50)        # 해당 좌표로 이동한다.
t.pendown()              # 펜을 종이에 놓는다.
t.circle(40, steps=3)    # 반지름이 40인 원을 3 step으로만 그린다. ==> 삼각형이 그려짐

t.penup()
t.goto(-100, -50)
t.pendown()
t.circle(40, steps=4)

t.penup()
t.goto(0, -50)
t.pendown()
t.circle(40, steps=5)

t.penup()
t.goto(100, -50)
t.pendown()
t.circle(40, steps=6)

t.penup()
t.goto(200, -50)
t.pendown()


t.circle(40, steps=40)
반응형
반응형

 


함수의 정의와 호출


함수: 여러 개의 statement를 하나로 묶은 단위
* 함수는 반복적 수행이 가능하며, 코드를 논리적으로 이해하는데 도움을 줌. 또한 코드의 일정
 부분을 별도의 논리적 개념으로 독립화 가능


간단한 함수의 정의 → def: 함수 정의 시 사용하는 키워드


함수 객체와 함수 호출
* 함수 이름 자체는 함수 객체의 레퍼런스를 지님
* 함수 이름에 저장된 레퍼런스를 다른 변수에 할당하여 그 변수를 이용한 함수 호출 가능
* 함수 몸체에는 최소한 한 개 이상의 statement가 존재해야 함 (없으면 pass 사용)


함수 인수값 전달 방법
* 기본: 값에 의한 호출(call-by-value) → 실제로는 참조에 의한 호출(call-by-reference)
* 함수 인자에 변경불가능 객체인 숫자값, 문자열, 튜플을 전달하면 의미 없음
* 함수 인자에 변경 가능한 객체인 리스트와 사전을 전달하면 올바른 전달법 및 활용법


- 반환문 : 인수 없이 return문 사용하면 None 객체 전달


- 함수 인자에 대한 동적인 자료형 결정 : 함수 인자는 함수가 호출되는 순간 해당 인자에 전달되는
 객체에 따라 타입 결정

 

함수 인수 처리


기본 인수 값 : 함수를 호출할 때 인수를 넘겨주지 않아도 인수가 기본적으로 가지는 값
* incr(a, step=1)에서 step=1과 같은 형태를 가짐
* 함수 정의를 할 때 일반적인 인수 앞에 기본 인수 값 올 수 없으나 여러 개는 정의 가능


키워드 인수 : 인수 값 전달 시 인수 이름과 함께 값을 전달하는 방식
* 함수 호출 시 키워드 인수는 마지막에 위치해야 함


가변 인수 리스트 : 함수 정의 시 일반적인 인수 선언 뒤에 *var 형식의 인수로 가변 인수 선언
* var 에는 함수 호출 시 넣어주는 인수 값들 중 일반 인수에 할당되는 값을 제외한 나머지 값들을
 지닌 튜플 객체가 할당됨
* C 언어의 printf문과 유사한 형태의 printf 정의 됨


튜플 인수와 사전 인수로 함수 호출하기
* 함수 호출 시 * 사용하고 뒤에 튜플을 넣으면 튜플 전체 호출 가능
* 함수 호출 시 ** 사용하고 뒤에 사전을 넣으면 사전 전체 호출 가능

반응형
반응형

파일 다루기


파일 목록 얻기
* os.listdir(‘경로’) → 디렉토리 안에 들어 있는 각 파일 목록 반환


파일 종류 알아보기
* os.path.isfile(fpath) → 순수 파일이면 true
* os.path.isdir(fpath) → 디렉토리면 true
* os.path.islink(fpath) → 심볼릭링크면 true


파일의 허가권
* os.access(filepath, mode) → 파일의 허가권 알아보기
   / mode에 os.F_OK이면 파일 자체가 존재하는 것을 테스트
   / mode에 os.R_OK이면 읽기 권한이 있는 것을 테스트
   / mode에 os.W_OK이면 쓰기 권한이 있는 것을 테스트
   / mode에 os.X_OK이면 실행 권한이 있는 것(또는 디렉토리인지)을 테스트
* os. access(filepath, mode) → 파일의 허가권 변경하기

 

파일 다루기


파일 조작하기
* os.rename(old_filepath, new_filepath) : 파일 이름 변경하기
* os.rename(old_filepath, folder name/new_filepath) : 파일 이동하기
* shutil.copyfile(src_filepath, dest_filepath) : 파일 복사하기


파일 이름 다루기
* os.path.abspath(상대경로) : 상대 경로를 절대 경로로 변환하기
* os.path.exists(filename) : 주어진 경로의 파일이 존재하는지 확인
* os.curdir : 현재 디렉토리, os.pardir : 부모 디렉토리를 가리키는 이름 얻기
* os.sep : 디렉토리 분리 문자 얻기


경로명 분리하기
* os.path.basename(f) : f 경로에서 파일명만 추출
* os.path.dirname(f) : f 경로에서 디렉토리 경로 추출
* os.path.split(f) : 경로명과 파일명을 한 번에 분리
* os.path.splitext(f) : f 경로의 확장자 분리

 

표준 출력 방향 전환


디렉토리에 관련된 일반 작업
* os.getcwd() : 현재 작업 디렉토리 알아보기
* os.chdir() : 작업 디렉토리 변경하기
* os.mkdir() : 디렉토리 만들기
* os.rmdir() : 디렉토리에 내용이 없을 시 삭제
* os.removedirs(filepath) : 맨 오른쪽부터 단계별 디렉토리 삭제
* shutil.rmtree() : 하위 디렉토리까지 모두 한 번에 삭제
* shutil.copytree(src_filepath, dest_filepath) : 하위 디렉토리와 파일 등을 지니고 있는
 디렉토리 복사


디렉토리(트리) 탐색하기
* os.walk(filepath) : filepath부터 시작하여 재귀적으로 모든 하위 디렉토리 탐색
 탐색 시 발견하는 모든 파일에 대해 다음 튜플을 리턴 (dirpath, dirnames, filenames)

반응형
반응형


파일 입출력 방법
 파일을 열어서 읽고, 쓰고, 덧붙이는 방법
  * open(filename, mode) 내장 함수로 filename 이름을 지닌 file 객체를 얻고 작업 수행 후
     close()를 호출하여 작업 프로세스 자원 점유 해제
 
파일 처리 모드의 종류 : open 내장 함수의 두 번째 인자 mode 설명(생략하면 r모드 설정)
  mode   간단 설명
‘r’ 읽기 전용(기본 모드)
‘w’ 쓰기 전용
‘a’ 파일 끝에 추가
‘rb’ 이진 파일 읽기 전용
‘wb’ 이진 파일 쓰기 전용
‘ab’ 이진 파일 끝에 추가

 

파일 입출력 방법

os.getcwd( ) → 현재 작업중인 폴더를 알아보는 함수
라인 단위로 파일 읽기
 * 파일 객체의 반복자(iterator) 이용하기
 * readline() : 한 번에 한 줄씩 읽음 / readlines() : 파일 전체를 라인 단위로 끊어 리스트에 저장
 * xreadlines() : 파일 전체 읽기 X, 상황별로 필요한 라인만 읽음

파일 포인터 : 파일 내에서 현재 위치를 가리키고 있음

파일 접근 방법
 * 순차 접근 (기본 방식) : 파일을 앞에서부터 순차적으로 읽고 쓰는 방식
 * 임의 접근 : 파일 내 임의 위치에서 읽고 쓰는 방식
    - seek(n) : 파일의 가장 첫 번째 위치에서 n번째 바이트로 포인터 이동
    - tell() : 파일 내 현재 포인터 위치를 반환


표준 출력 방향 전환

 

sys.stdout : 표준 출력
sys.stderr : 표준 에러 출력 → 파일 객체로 변환하면 모든 표준 출력(print)는 해당 파일로 저장됨
sys.stdin : 표준 입력

표준 출력을 파일로 저장하기
 * 표준 출력 저장해 두기 (ex: stdout = sys.stdout)
 * 파일 객체로 표준 출력 변경 (ex: sys.stdout = f)
 * 표준 출력 원상 복구 ( ex: sys.stdout = stdout)

>> (부등호 2개) : 표준 출력이 아닌 다른 쪽으로 출력

StringIO 모듈의 StringIO 클래스 객체
 * 파일 객체처럼 입출력 가능한 문자열 객체
 * StringIO에 지원되는 메소드는 파일 객체가 지원하는 메소드와 거의 동일
 * getvalue() 메소드 → 현재까지 담아 놓은 전체 내용 반환

 

파일로의 지속 모듈

 

지속성 : 프로그램 내 생성된 각종 객체들을 해당 프로그램 종료 이후에도 존재하게 만들고, 동일하거나 다른 프로그램에서 사용할 수 있도록 하는 기능

 

지속성 기능을 지원하는 모듈
 DBM 관련 모듈 : anydbm, dbm, gdbm, dbhash, dumbdbm
 * anydbm : 시스템에서 사용 가능한 모듈 중 가장 최적의 모듈 반환
       기본적으로 dumbdbm을 반환
       사전 자료형을 사용하는 것과 동일한 방법으로 사용
 * pickle 모듈 : 파이썬 객체를 저장하는 일반화된 지속성 모듈
        파이썬의 기본 객체 뿐만 아니라 사용자 정의의 복잡한 객체도 저장 가능
        기본적으로 텍스트 모드로 저장하지만 이진 모드로도 저장 가능
 * pickle.dump(저장하고자 하는 객체, 저장하는 위치)
 * pickle.load(저장했던 위치) → 저장했던 객체 불러옴

 

 

 

반응형

+ Recent posts