Optimized C++ (C++ 최적화)

정말 강력하게 추천하는 책이다. 책의 내용 구성부터 너무나도 알차다. 초반에는 기본적으로 최적화 할 수 있는 방향을 제시함으로써 C++ 을 최적화를 해야하는 이유를 자세히 설명을 해준다. 사실 모든 언어에서도 최적화는 필요로 하지만 방대한 자료와 자율성을 가진 C++ 로써는 최적화의 기법도 상당히 많고, 기괴하다. 개인적으로 C++ 기초 공부하고 Effective C++ 책을 보며 실력을 향상시키는 정석(?) 적인 방향으로 잡았었다면 개인적으론 STL 기본 공부까지 마치고 난뒤 이책을 꼭 보라고 추천하고 싶다. 기본적인 STL을 무작정 사용하지 않고 어떻게 사용하면 효과적으로 성능을 낼 수 있을지 자세히 설명이 되어있다. 또한 STL을 사용하며 주의점도 알려줌으로써 기본적인 STL 사용법을 강화 시켜 줄 수 있을것 같다. 또한 입출력 최적화, 스레드 최적화 메모리 최적화도 설명 함으로써 아주 심화 깊은 얘기를 다룰수는 없는 분량이지만 자신이 조금더 깊은 공부를 하고 싶다면 이책을 꼭 한번 읽고 공부를 하면 좋을 것같다는 생각이 든다. 책의 난이도는 약간 있으니 초심자가 보기는 부담 스러울 수는 있으나, 방대한 양을 설명을 하기보단 기본적이고 핵심적인 최적화를 설명하기에 꼭 읽어보길 추천하며 기본 문법과 간단한 STL 공부는 하고 책을 읽으면 훨씬 많이 도움이 될 책이다.

 

 

드디어 기다리고 기다리던 갤럭시 홈 미니! 요즘은 수많은 가전 제품과 연동되는 스마트 홈 스피커가 많이 출시 되었다. 카카오,KT,구글,아마존 등등.. 수많은 스마트 홈 스피커가 출시 되었지만 실질적인 제조사와 연동되는 스마트 홈 스피커는 없었다.

이번에 삼성에서 출시하는 갤럭시 홈 미니를 사용하면 기존에 잘 사용하던 smart things 을 사용하여 집에 삼성 가전제품들을 컨트롤 하거나 모니터링을 할 수 있게 되었는데, 아무래도 기기 제조사 끼리 사용하는게 궁합이 잘 맞을것 같기에 엄청나게 기대를 해보고 있다. 안그래도 좀더 편리한 라이프를 즐기는 스타일 이기에 신청 하게 되었다. 아래 사진 또한 갤럭시 노트8로 촬영한 스크린샷이다. 

빨리 만나 봤으면 좋겠다!! 하단에 신청 URL도 있으니 신청 하시면 됩니다!

 

 

 

 

 

https://www.samsung.com/sec/templateEvent/Home_Mini_Beta

 

Home_Mini_Beta

Home_Mini_Beta

www.samsung.com

 

MariaDB는 최근에 가장 핫한 데이터베이스 이다. 최근 CentOS 의 경우 기본 데이터베이스를 MySQL 에서 MariaDB로 교체되면서 입문자들이 CentOS 를 설치 하면 많이 보았을 데이터베이스이다. MySQL 과 똑같다 봐도 무방하지만 이제는 다른 회사로 분리가 되어 출시가 되었음으로 독립적인 프로젝트라고 봐도 무방하다. 이전부터 MySQL 과 PHP의 연동은 필수적인 요소로 생각할 만큼 궁합도가 높았는데 최신 MariaDB에 관한 책의 내용은 따로 없었지만 이번에 한빛미디어에서 출판한 "이것이 ~ 다" 시리즈중 MariaDB관련 내용이다. 역시나 데이터베이스의 기본 개념부터 탄탄히 설명이 되어 있어서 초보가 봐도 전혀 부담이 없는 책이다. PHP와의 연동 부분은 생각보다는 작은 부분이지만 꼭 필요한 부분은 정확하게 설명이 되어있으니 이책을 보면서 MariaDB를 통해 데이터베이스와 PHP 연동법, 데이터베이스의 기본개념을 익힐수 있는 좋은 책이라 생각된다. 

'리뷰' 카테고리의 다른 글

Optimized C++ (C++ 최적화)  (0) 2019.09.14
삼성전자'갤럭시 홈 미니' 베타 테스트 실시!!  (0) 2019.08.29
이것이 MariaDB다  (0) 2019.08.07
혼자 공부하는 C언어 (혼공C)  (0) 2019.07.08
알고리즘이 욕망하는 것들  (0) 2019.06.07
이것이 자바다  (0) 2019.04.11

혼자 공부하는 C언어 (혼공C) C언어 프로그래밍 관련 책이다. 개인적으로 입문서는 원서를 추천하며, 원서가 읽기 힘든 사람에겐 다른 책을 추천을 해줬다. 워낙 인기가 있으니 해당 책의 언급은 하지 않도록 하겠다. 딱 잘라 말하면 그에 준하는 읽기 쉽게 구성이 되어있다. 쉽게 읽으면서 C언어를 공부하며 가장 힘들어하는 핵심적인 포인터 부분을 책의 반이상에 넣어 독자가 포인터에 겁을 먹지 않도록 해주고 있는것이 가장 큰 장점인것 같다. 이책의 개인적으로 좋아하는 부분은 C언어를 초장기에 배웠을 당시 대학 시험에서 그렇고 손으로 코딩하여 문제를 푸는 점이 나에게 가장 좋았던 공부법이라 생각한다. 나는 C언어를 처음 배우는 사람에게 무조건 손으로 직접 써보라고 할정도로 이책은 가장 처음부터 "직접 해보는 손코딩" 항목이 따로 있어 좋은 습관을 들일 수 있도록 해준다. 또, 다른 책들은 결과값을 따로 빼놓아서 소스코드를 보며 왔다갔다 하며 결과값을 확인해야 하지만 이책은 바로 그 코드에 결과값을 넣어 쉽게 확인 할 수 있도록 하였다. 책이 정말 사소한 부분을 독자가 어떤 부분에서 필요하고 불편한지를 잘 아는것 같아서 읽기 굉장히 편했다. C언어중 가장 핵심적이며 설명하기 어려운 포인터부분을 그림으로 설명하고 있어 C언어를 배우는 사람들에게 꼭 책을 추천을 해줘도 혼나지 않을것 같다는 생각이든다.

'리뷰' 카테고리의 다른 글

삼성전자'갤럭시 홈 미니' 베타 테스트 실시!!  (0) 2019.08.29
이것이 MariaDB다  (0) 2019.08.07
혼자 공부하는 C언어 (혼공C)  (0) 2019.07.08
알고리즘이 욕망하는 것들  (0) 2019.06.07
이것이 자바다  (0) 2019.04.11
이것이 C# 이다.  (0) 2019.02.08

요즘 컴퓨터 관련 분야의 초점은 인공지능에 초점이 많이 맞추어져 있다. 또 인고지능을 얘기하면서 꼭 빼놓지 않고 얘기하는 것이 있는데 바로 알고리즘에 대해서다. 알고리즘이란 IT관련된 일을 하는 사람이라면 필수 적인 부분이다. 이렇게 기술적으로 들어가려고 한다면 이책은 추천하고 싶지가 않다. 이책의 구성은 IT와 관련이 없는 사람이더라도 어렵게만 느껴지는 IT분야에서 주로 사용하는 알고리즘을 인문학적으로 풀어 설명을 하고 있기에 어느 누구도 이 책을 본다면 알고리즘에 단어 자체에 거부감이 많이 줄어 들것이라 생각이 든다. 여러 IT에서 내노라 하는 대기업 에서 사용하는 알고리즘에 대해 설명을 하며 흥미를 많이 이끌어 올렸다. IT전공자라면 알고리즘 공부에 대해 거부감이 있다거나, 알고리즘을 공부하며 머리가 복잡할때, 비전공자 와 비 IT분야에서 일하지만 최신 IT 용어와 기술에 관심이 있는 초심자라면 이 책을 읽기에 부담이 없어 추천할수있는 책이다. 

'리뷰' 카테고리의 다른 글

이것이 MariaDB다  (0) 2019.08.07
혼자 공부하는 C언어 (혼공C)  (0) 2019.07.08
알고리즘이 욕망하는 것들  (0) 2019.06.07
이것이 자바다  (0) 2019.04.11
이것이 C# 이다.  (0) 2019.02.08
처음 시작하는 R 데이터 분석  (0) 2019.02.08

JAVA 를 제대로 공부하기 위해 여러 책들을 보았다. 보았던 책들 중 난 정말 JAVA를 공부한 적 없어요, JAVA 의 정석등 여러 책들을 보았고 기초를 다졌다. 하지만 이번에 "이것이 자바다"의 책을 보면서 다시 JAVA를 공부한다는 마음으로 책을 보았다. 책의 구성은 1권과 2권으로 나누어져 있으며 1권은 자바 언어 문법과 객체 지향 프로그래밍 요소를 설명한다. 2장은 자바 API를 사요하여 고급 기능등을 사용할수 있도록 설명한다. 재미있는 점이 IO 기반 입출력과 NIO 기반 입출력 네트워킹에 대한 설명이 있다. 심도 깊은 내용은 아니지만 이 책을 보면서 공부하며 자신감으로 네트워크 프로그래밍에도 자연스럽게 공부 할 수 있도록 구성되어있다. 책의 내용은 정말 위 처음에 설명한 책들만큼 내용이 알차다. 또한 마음에 드는것이 자바 문법을 도식화처럼 그림을 그려 놓아 단순 문법만 써놓고 책의 내용을 이해하는 것보다 쉽게 이해할수 있어 좋았다. 굳이 아쉬운 점을 하나 고르라면 예제의 코드에 대해 설명이 생각보다는 빈약하다는 것이다. 내가 생각하는 빈약의 관점은 소스코드에는 설명이 되어있지만 한줄 한줄 설명한 책들이 있기에 그것을 비교하여 적다는 뜻이고, 생각해보면 그렇게 중요한 부분도 아니기에 초심자가 읽기에도 무리가 없을 것 같다. 책의 구성은 어느 책보다는 너무 나도 알차기에 초심자가, 또한 개발을 하며 기초가 필요할 때 읽으면 정말 좋은 책인것 같다. 

제나름 대로 사용하기 위해서 만들어 본것입니다. 오역이 많습니다. 참고하거나 틀린점이 있으면 댓글 부탁 드립니다.

원본은 다음과 같습니다.


Using process

Overview

인터넷을 통해 서버로 접속하는 것처럼 Twisted 는 로컬 프로세스에 같은 API로 접속 할수 있다. API 는 다음과 같다

Running Another Process

reacotr를 통해 프로세스를 실행하려면 reactor.spawnProcess를 사용해야한다. Pipe는 child process에 만들어 지고, reactor 에 추가된 어플레키에션은 블록되지 않은 상태로 데이터를 새로운 프로세스에 주고 받을 수 있다. reactor.spawnProcesss는 두개의 인자값인 processProtocol executable 이 필요하다. 추가적으로 arg, enviroment, path, userID, groupID, usePTY, and childFDS를 사용 할수 있다. 이 모든것이 Windows에서 사용 할수 있는건 아니다.

from twisted.internet import reactor

processProtocol = MyProcessProtocol()
reactor.spawnProcess(processProtocol, executable, args=[program, arg1, arg2],
 env={'HOME': os.environ['HOME']}, path,
 uid, gid, usePTY, childFDs)
  • processProtocol : tiwsted.internet.protocol.ProcessProtocol 의 하위 클래스 여야 하며 인터페이스는 하단에 설명 한다.
  • executable : 프로그램이 실행 할 절대경로 이것은 processProtocol 이 접속 될것이다.
  • args : 프로세스를 실행하기 위하여 넘겨지는 argument 이고 arg[0]은 항상 프로레스 이름이 되어야 한다.
  • env : 프로세스에게 넘겨줄 환경변수 type은 dictinaory 이다.
  • path : 프로세스가 실행될 위치. 프로세스는 현재 디렉토리로 주어지기 전까지 사용하고 path를 사용한다면 디렉토리는 변경 될 것이다.
  • uid, gid : 유저 ID와 그룹 ID 이며 기입시 해당 유저와 그룹 ID 로 실행된다.
  • userPTY : 프로세스가 pty 를 사용할 것인지 아니면 pipe의 쌍을 사용할건지 명시한다. Python PTY
  • childFDs : 하위 프로세스의 descriptor 를 사용할지 정한다. 각 키는 file descriptor 의 숫자(Integer)이며 하위 프로세스에서 보여질 것이다. 0, 1, 2 FD는 stdin, stdout, stderror 이지면 몇 프로그램은 추가적인 fds를 커맨드 라인이나 환경 변수로 설정한다. 각 integer 값은 부모의 file descriptor 이고 r 은 부모로가 읽을 수 있고 w는 부모가 쓸수 있는 파이프를 만드는 문자열이다. 만약 childFDS가 제공되어 지지 않는 다면 기본적으로 stdin-write, stdout-reader, stderr-reader 파이프로 기본적으로 생성 된다.

args 와 env 는 기본적으로 비어 있는 값이다. args[0]은 executable과 같아야 한다. 만약 env에 os.environ 이 주어진다면 하위 프로세스는 현재 프로세스로부터 상속 받는다. reactor.spawnProcess IProcessTransport를 상속받아 구현된다.

Writing a ProcessProtocol

ProcessProtocol 은 spawnProcess와 상호작용을 한다. 일반 프로토콜과 비슷 하지만 몇가지 특정 이벤트를 처리를 추가하는 방법이 있다. 우리의 예제는 wc를 사용하여 예제를 구현한다. 첫번째로는 ProcessProtocol을 초기화 한다.

from twisted.internet import protocol
class WCProcessProtocol(protocol.ProcessProtocol):

    def __init__(self, text):
        self.text = text

ProcessProtocol이 연결이 되었을대 connectionMade 메소드를 호출한다. 우리의 프로토콜에선 텍스트를 표준 입력으로 쓰고 표준 입력을 닫아서 프로세스가 우리가 표준 입력을 마쳤다는것을 알릴것이다.

...
def connectionMade(self):
    self.transport.write(self.text)
    self.transport.closeStdin()

이 시점에서 프로세는 데이터를 받고 결과를 읽을 시간이다. dataReceived 로 데이터가 수신되는 대신에 표준 출력데이터는 outReceived로 수신되어진다. 이것은 표준 오류에 대한 데이터와 구별하기 위한 것이다.

...
def outReceived(self, data):
    fieldLength = len(data) / 3
    lines = int(data[:fieldLength])
    words = int(data[fieldLength:fieldLength*2])
    chars = int(data[fieldLength*2:])
    self.transport.loseConnection()
    self.receiveCounts(lines, words, chars)

이제 프로세스가 출력을 파싱하여 프로세스 연결을 종료 하였다. 그런 다음 결과를 마지막 메서드로 결과를 보낸다. 이것은 클래스의 사용자가 데이터를 사용하여 다른 작업을 수행하도록 재지정 할 수 있다. 이 예제에서는 단지 결과를 출력 하는것 뿐이다.

...
def receiveCounts(self, lines, words, chars):
    print('Received counts from wc.')
    print('Lines:', lines)
    print('Words:', words)
    print('Characters:', chars)

작업을 다하였다 WCProcessProtocol을 사용하기 위해서 우리는 spawnProcess를 사용하여 인스턴서를 넘겨 준다.

from twisted.internet import reactor
wcProcess = WCProcessProtocol("accessing protocols through Twisted is fun!\n")
reactor.spawnProcess(wcProcess, 'wc', ['wc'])
reactor.run()

Things that can happen to your ProcessProtocol

ProcessProtocol 을 상속 받아서 오버라이드 해야하는 함수에 대해 설명

  • connectionMade() : 프로그램이 시작될때 호출 되어지고 stdin pipe 를 통해 데이터를 쓰기 가장 좋은 위치다. (using self.transport.write)
  • outReceived(data) : 하위 프로세스 에서 데이터를 받을때 호출 되어진다. 파이프는 socket보다 큰(보통 1kb) 사이즈를 제공하려는 경향이 있어서 네트워크 소켓의 전형적인 랜덤 드립과 드랍 행동을 경험하지 않을 수 있다 하지만 한번에 데이터를 어지 못한다면 대처할 준비가 되어 있어야 한다. 제대로 수행하려면 수신자가 데이터를 축적하고 프로세스가 완료 될때까지 모든 작업을 연기해야 한다.
  • errReceived(data) : outReceived 처럼 동작하며 프로세스의 stderr pipe 로부터 호출 되어진다.
  • inConnectionLost : 프로세스의 stdin pipe가 닫힘을 reactor 로부터 통지 받는다. 프로그램은 일반적으로 자신의 stdin을 닫지 않으며self.transport.loseConnection을 ProcessProtocol 에서 닫을때 호출 될 것이다.
  • outConnectionLost : 프로그램이 stdout pipe를 닫을때 호출 되어진다. 대게 프로그램이 종료 될때 호출되어진다.
  • processExited(status) : 이 호출은 하위 프로세스가 회수 되거나 프로세스의 종료 정보를 받으면 호출 되어진다. 이 상태는 프로세스가 정상적으로 종료된 경우 (signal을 수신하지 않고 자연적인 원인으로 사망하고 종료 코드가 0인 경우), ProcessTerminated (.exitCode 속성을 가진경우) 를 보유하는 .value 로 생선된 Failure인스턴스의 형태로 전달된다.
  • processEnded(status) : file desciptor와 연관된 하위 프로세스가 닫히거나 프로세스가 회수 되어질때 호출 되어진다. 이것은 ProcessProtocol의 마지막으로 콜백할것을 의미한다. status 파라메터는 processExited 와 같은 의미이다.

이러한 함수의 대부분에 대한 기본 클래스 정의는 no-ops입니다. 이것은 모든 튼튼하고 찌르레기가 버려지게 할 것이다. 파이프를 읽지 않으면 전체 파이프에 쓰기 위해 어린이 프로세스가 결국 차단됩니다. 즉, 파이프를 읽지 않아도됩니다.

Things you can do from your ProcessProtocol

하위 프로세스를 다루는 기본적인 방법 입니다.

  • self.transport.write(data) : data는 stdin pipe 입니다. write 메소드는 즉시 작성할 수 없는 데이터는 queue가 될것이다. 파이프가 다시쓰게 된다면 쓰기가 다시 시작될 것이다.
  • self.transport.closeStdin : stdin 파이프를 닫는다. 프로그램은 필터 역할을 한다 ( stdin 으로부터 읽기, data 수정, stdout 으로 데이터 쓰기) 보통 해당 작업이나 프로세스 종료 하는것으로 받아 들인다. 프로그램들이 다끝나면 stdin 을 닫는것이 중요하다. 그렇지 않으면 하위 프로세스는 절대로 끝나지 않을 것이다.
  • self.transport.closeStdout : 대게 호출 되어지지 않는다. stdout 에 쓰려고 하면 SIGPIPE 오류가 발생될 것이다.이 과정은 훌륭한 과정은 아니다.
  • self.transport.closeStderr : 대게 호출 되어지지 않는다. self.transport.closeStdout 과 같은 이유로
  • self.transport.loseConnection : 3개의 모든 파이프를 닫는다.
  • self.transport.signalProcess('KILL') : 하위 프로세스를 죽인다. 보통 processEnded가 호출 될 것이다.

Verbose Example

wc 프로그렘 작성

process.py
---
#!/usr/bin/env python

# Copyright (c) Twisted Matrix Laboratories.
# See LICENSE for details.

from __future__ import print_function

from twisted.internet import protocol
from twisted.internet import reactor
import re

class MyPP(protocol.ProcessProtocol):
    def __init__(self, verses):
        self.verses = verses
        self.data = ""

    def connectionMade(self):
        print("connectionMade!")
        for i in range(self.verses):
        self.transport.write("Aleph-null bottles of beer on the wall,\n" +
         "Aleph-null bottles of beer,\n" +
         "Take one down and pass it around,\n" +
         "Aleph-null bottles of beer on the wall.\n")
        self.transport.closeStdin() # tell them we're done

    def outReceived(self, data):
        print("outReceived! with %d bytes!" % len(data))
        self.data = self.data + data

    def errReceived(self, data):
        print("errReceived! with %d bytes!" % len(data))

    def inConnectionLost(self):
        print("inConnectionLost! stdin is closed! (we probably did it)")

    def outConnectionLost(self):
        print("outConnectionLost! The child closed their stdout!")
# now is the time to examine what they wrote
#print("I saw them write:", self.data)
        (dummy, lines, words, chars, file) = re.split(r'\s+', self.data)
        print("I saw %s lines" % lines)

    def errConnectionLost(self):
        print("errConnectionLost! The child closed their stderr.")

    def processExited(self, reason):
        print("processExited, status %d" % (reason.value.exitCode,))

    def processEnded(self, reason):
        print("processEnded, status %d" % (reason.value.exitCode,))
        print("quitting")
        reactor.stop()

pp = MyPP(10)
reactor.spawnProcess(pp, "wc", ["wc"], {})
reactor.run()

이 프로그램의 정확한 출력은 비동기 이벤트 타이밍에 따라 다릅니다. 특히 프로그램은 하위 프로세스가 stderr 파이프가 닫히기 전이나 stdout 파이프로부터 읽은 후를 관찬 할 수 있다. 가능한 아래와 같을 것이다.

% ./process.py
connectionMade!
inConnectionLost! stdin is closed! (we probably did it)
errConnectionLost! The child closed their stderr.
outReceived! with 24 bytes!
outConnectionLost! The child closed their stdout!
I saw 40 lines
processEnded, status 0
quitting
Main loop terminated. 

Mapping File Descripotrs

stdin, stdout, stderr 은 단지 컨벤션이다. 프로그램은 일반적으로 input 은 fd0, 외부로 출력인 fd1, 에러를 발생하는 fd2 이다. 이것은 표준 C 라이브러리 매크로와 같다. stdin은 fd0 을 의미한다 그리고 쉘에선 파이프는 |을 의미하고 fd1으로 부터 명령을 다음 커맨드의 fd0 으로 리다이렉션 과 같다. 그러나 이것은 단지 컨벤션이며 프로그램은 자유롭게 file descriptors 를 추가 할수 있으며 표준 3개의 fd 를 무시 할 수도있다. childFDsargument는 자식 프로세스를 제공해야 하는 file descripotrs 를 정확히 지정 할 수 잇다.

각 childFD 는 3개중에 한개만 넣을 수 있다.

  • 부모 FD를 매핑 : 부모와 같은 읽기 쓰기와 같은 것을 할 수 있다
  • 부모로 부터 읽을 수 있는 파이프를 넣는다.
  • 파이프로 부터 부모에게 쓸수 있도록 넣는다.

childFDs를 매핑하는 것은 대게 하위 프로세스의 stderr 를 부모와 같은 곳에 출력 하기 위해 사용된다. shell 로부터 프로그램을 실행 시킬때 대게 fds 0, 1, 2는 쉘의 0,1,2와 매핑 되어 진 상태로 하위 프로그램의 출력을 같은 터미널에서 볼수 있도록 한다. 마찬가지로, inetd는 일반적으로 stdin 과 stdout 을 네트워크 소켓에 매핑하고 stderr를 동일한 소켓 또는 일종의 로깅 메커니즘에 매핑 할 수 있다. 이는 하위 프로그램이 네트워크에 대한 지식 없이 실행될수 있도록 한다.

부모의 읽기 파이프는 child의 output을 가지기 위해 사용되어지고 하위 프로세스와 interactive 를 하기위한 공통 공통된 방법이다.

부모의 쓰기 파이프를 하위 프로세스에 주면 하위 프로세스를 통제 할 수 있다. FTP와 BC 같은 프로그램은 명령을 stdin 스트림에 작성하여 이러한 방식으로 제어 할 수 있다.

childFDs dictionary는 file descriptor 숫자를 위의 조건 3가지의 상태중 1개를 할 수있다. 부모의 fd들중 한개를 맵핑하고 싶다면 간단하게 fd의 숫자를 값처럼 넣어주면 된다. read 파이프를 매핑 하려면 r을 값처럼 사용하면 된다. write 파이프를 매핑 하고 싶다면 w를 사용하면 된다.

아래 예제는 기본적으로 stdin/stdout/stderr 파이프를 매핑하는 것이다. 이것은 dictionary 타입으로 되어있다.

childFDs = {0: "w", 1: "r", 2: "r"}

부모의 파이썬 프로그램이 하는 것과 동일한 장소에 읽고 쓰는 프로세스를 시작하려면 다음을 사용한다.

childFDs = {0: 0, 1: 1, 2: 2}

fd를 추가하려면 다음과 같이 한다.

childFDs = {0: "w", 1: "r", 2: "r", 4: "w"}

ProcessProtocol with extra file descriptors

childFDs dictionary 를 보통 3개의 fd보다 더 제공 되어질때 이런 파이프를 접근 하기위해 추가적인 메소드가 필요하다. 이러한 방법은 위에서 설명한 outReceived 방법보다 더 일반적이다. 사실 이런 메소드(outReceived and errReceived) 는 오래된 코드를 호환하기위해 래핑되어있다. 새로운 ProcessProtocol 은 다음을 따르고 있다.

  • connectionMaded : 프로그램이 시작되어질때 호출 되어진다.
  • childDataReceived(childFD, data) :프로세스의 output pipe 들중 데이터를 받을때 호출되어진다 (예를 들어 childFDs 값이 r 이면 실질적인 숫자는(하위 프로세스의 관점에서) childFD에 있다. 호환을 위해 childFD가 1또는 2일때 childDataReceived outReceived errReceived로 디스패치하게 되어있다.)
  • childConnectionLost(childFD) : 이것은 reactor 로부터 프로세스의 파이프가 닫힐때 통지 도이ㅓ진다. 이것은 단지 부모의 파이프가 닫힌것인지( self.transport.closeChildFD과 같은), 하위 프로세스에서 명시적으로 파이프로 닫을때(때때로 EOF를 가르킴), 하위 프로세스가 종료 되거나 커널이 모든 파이프를 닫을때를 의미한다. childFD argument는 파이프가 닫혔다고 말한다. 파이프에 매핑된 파일 설명자에 대해서만 알수있다 기존 FD에 매핑 될때 부모는 그들이 언제 닫혔는지 알 수 있는 방법이 없습니다. 호환을 위해 기본적으로 inConnectonLost,outConnectionLost, errConnectionLost 디스패치 되어있다.
  • processEnded(status) : 하위 프로세스가 종료되어질때 나 파이프가 종료 되어질때 호출 되어진다. 이것은 종료 되기전에 모든 데이터들이processEnded가 실행되기 전에 쓰여진다.

이러한 것 이외에도 하위 프로세스에게 사용 할 수있는 메소드는 다음과 같다.

  • self.transport.writeToChild(childFD, data) : input 파이프로 데이터를 넣을때 간단하게 write는 childFD = 0 에쓰는 것과 같다.
  • self.transport.closeChildFD(childFD) : 하위 프로세스들중 하나를 닫아라. input 파이프를 다는것은 공통적으로 EOF 를 하위 프로세스에게 가르킨다. 출력 파이프를 다는것은 매우 유용하지도 않다.

'개발 > Python' 카테고리의 다른 글

Twisted/Using Process 번역  (0) 2019.03.07
Twisted/ Static File server file listing disable  (0) 2019.02.10

Twisted 를 사용하면서 웹의 static한 파일들을 사용하려면 Resource를 만들어서 serve해야 한다

위와 같이 serve할 path를 지정해주고 사용을 하면 되는 것인데, 이렇게 사용한다면 단점이 있다..

단점이라 함은 static.File Class가 자체적으로 해당 위치에 접속을 하게 되면 해당 파일 내용들이 나오게 되어 난감한 상황을 발생시키게 된다.

이것은 기본적으로 Twisted에서 directory listing을 off 하게 해주면 좋을듯 한데. 그것까진 지원이 되는것 같지 않아 아쉽다.

[기본적은 file serve하고 해당 폴더를 입력시 위와 같이 Directory Listing이 나온다]


해당 문제라기 보다는 Twisted의 기본적인 API문서를 보면 알게 되는데 해당 API는 아래와 같이 기술되어있다.


Twisted Static File API[링크]


위와같이 위치를 설정하면 해당 내용들이 자동적으로 HTML형식으로 리스팅 되어서 내온다는 말이다. 자 대충의 내용은 알았으니 실질적인 File Listing을 Disable을 해보자.


처리 방식은 다음과 같다.


해당 API문서를 보면 directoryListing이란 method 가 있는데 이 메소드의 반환값을보면 다음과 같다.



여기에서 DirecotryListeter라는 클래스가 반환이 되어 지는데 이는 위에 기본적으로 file serve direcotryListing 모습의 클래스를 반환한다 안에는 CSS/HTML 태그등 다양한 템플릿 형태로 저장 되어있다.


그렇다면 DirecotryLister는 무엇일까 이것도 또한 Resource의 일부임으로 DirecotryLister 대신에 다른 리소스를 리턴해 준다면 해당 파일 리스트는 생성되지 않을 것이다. 가장 해결하기 편한 방법은 간단히 해당 file Class를 상속받아서 direcotryListing을 오버라이딩해서 Resource만 return 해주면 된다.

그래서 나는 다음과 같이 해당 클래스를 생성해서 사용하기로 했다.

이렇게 정의 하고 이것을 Resource로 사용한다면 해당 디렉터리 목록은 나오지 않게 될 것이다.



[설정 적용된 모습]


이렇게 한다면 해당 디렉터리 목록은 나오지 않지만 해당 static 파일들은 내오게 된다. 이런식으로 사용한다면 조금이나마 보안 설정을 할 수 있게 되지 않을까? 선택은 개인의 몫이며 해당 관련된 내용중 틀린 내용이 있거나 좋은 내용이 있다면 답글 달아주면 감사 하겠습니다.





'개발 > Python' 카테고리의 다른 글

Twisted/Using Process 번역  (0) 2019.03.07
Twisted/ Static File server file listing disable  (0) 2019.02.10

이것이 C# 이다. 최근에서 윈도우 GUI를  제작하는 프로젝트가 있어 C#을 배울 필요 성을을 느꼈는데, 알맞은 책인것 같다.

이책은 기존 뇌를 자극하는 시리즈에서 출발을 하였는데, 책의 내용이나 내용은 알찼으나 최신 C#의 문법을 배우기에는 오래 되었다는 아쉬움이 남아 있었다. 하지만 이것이 C#이라는 책은 최신 7.0 대의 버전으로 넘어온 시점에서 알맞은 책이란 생각을 한다. 가장 기본적인 형식부터 스레드, winform, 가비지 컬렉터까지 아우르는 방대한 양의 내용을 초보자가 읽기 쉽게 서술 하였고 중간중간에 나오는 그림들이 내용을 이해하기 쉽게 포인트를 집어서 설명한 것 같다. 이중에서 여기서 잠깐 이라는 부분이 있는데 이부분은 쉽게 넘어 갈수 있었던 내용들을 다시한번 간략하 설명을 함으로써 쉽게 잊어버리는 내용들이나 중요한 내용들을 다시한번 생각을 할 수 있도록 도와준다. winform 을 이용하여 윈도우 프로그래밍을 하기에는 방대한 양은 아니지만 C#을 배움으로써 연계되는 winform 의 내용들이 자연 스럽게 서술되어 어떤 방향으로 공부하면 될 것인지 알게 되었다. 인터넷을 통한 C#을 배우며 부족함이 느껴진 분이라면 반드시 이책을 구입하여 정독 하면 좋을 것 같다.


R데이터 분석에 관해 관심을 가지고 있는 사람, 혹은 데이터를 어떻게 분석해야할지 모르는 상태에서 읽기 좋은 책인것 같다.

대용량 분석에 활용하기에는 많이 부족하지만, 데이터의 형태, 분석의 방법론을 이해하기에는 기본기가 좋은 책임에 틀림 없다.

데이터 분석을하기위하여 TXT, CSV, Excel 데이터등을 활용하여 실무에서 사용 할 수 있는 가능한 범위 내에서 설명을 잘해 놓아서 책의 내용대로 따라하다보면 어느세 데이터 분석에 재미를 느끼고 있을 것이다. 또한 공공데이터를 가지고 분석을 하는 부분이 가장 재미있게 느껴졌는데 이 예제가 데이터 분석을 어떻게 응용할수 있는지에 생각을 키워준 것 같다.

이책은 여러 처음 시작하는 시리즈와 비슷한 맥락으로 무겁지 않고 가볍우면서도 쉽게 데이터 분석을 접근 하도록 하는 책이기에 데이터 분석 입문을 하는 사람에게는 꼭 추천을 해주고싶다.

+ Recent posts