22/1/2018

Python 함수 내부에서의 Null Validation 혹은 검증 로직에 대한 생각

def handle(data=None):
    """ 
   :param data: user's information, the type is dict
   :return: user's info added connection history
   """    
   if data is None:
        return {}
   ...
   return data

위와 같이 handle 함수에서 None 확인은 적절한 것일까요?

결론 부터 말하자면 NO 입니다. 함수내부에서 파라미터검사를 하는것이 틀린 방법은 아닙니다. 하지만 부득이한 경우가 아니라면 함수에 정상적인 값이 들어온다는 전제하에 함수를 작성하는 것이 효율적입니다. 위와 같은 코드의 단점은 무엇일까요?

  1. 함수 호출시 항상 None 체크 로직을 통과하게 된다.
    • 함수에는 일반적으로 대부분 정상적인 데이터가 들어오고, 아주 드물게 잘못된 데이터가 전달될것으로 예상됩니다. 그렇다면 매개변수의 검증은 호출하는 쪽에서 다루는게 맞을것입니다. 만약 항상 매개변수에 대한 검증이 필요하다면, 함수에 포함시키는 것보다는 decorator분리하거나, 검증 함수를 두는 것이 좋은 방법이 될수있습니다.
  2. 함수의 목적이 희석되다.
    • 일반적으로 함수가 단일 목적을 갖고 작성되면, 수많은 장점을 얻게 됩니다.
      1. 함수가 수행하려는 목적에 맞는 코드만 존재함으로서 처리 로직에 집중할있게됩니다.
      2. 가독성 향상. 무엇보다 코드가 날씬하고 이뻐집니다. 데헷. (파이썬 코드는 언제나 이뻐야한다!!!)
  3. 검증 로직의 추가가 필요하다면?
    • 해당 함수를 호출하는 곳이 많아지고, 매개변수 종류가 다양해 짐에 따라 검증로직을 계속 추가할수 없습니다.
    • 결국 특정 매개변수의 검증은 호출하는 곳에서 이루어 지는것이 좋은 경우도 있습니다.

일반적으로 말하는 함수에서의 Null Validation같은 검증 로직에 대한 생각을 간단하게 정리해 보았습니다. 위 내용이 정답은 아니지만 코드 작성시 자주 접하는 고민 사항임으로 같이 생각해보고 싶어서 글을 쓰게되었습니다. 읽어주셔서 감사합니다. 피드백은 언제나 환영합니다^^.

python pep pythonic convention
21/1/2018

50줄로 만들어 보는 tiny 블록체인

Blockchain

비트코인이나 암호화폐의 트랜잭션을 공개적이며 순차적으로 기록하는 디지털 분산 원장 입니다. - Google Search

보다 일반적으로 설명하자면, 블록체인은 새로운 데이터가 블록이라는 컨테이너에 저장되고, 이전 블록과 체인으로 연결된 변경불가능한 공용 데이터베이스입니다. 비트코인이나 다른 암호화폐에서 이러한 데이터는 트랜젝션(거래)의 묶음 이지만, 다른 타입의 데이터가수도 있습니다.

블록체인 기술은 비트코인 그리고 라이트코인과 같이 중앙기관에서 통제되지 않는 디지털 화폐를 탄생시켰습니다. 블록체인은 오늘날 금융시스템이 사기 또는 실폐의 대상이라고 믿는 개인에게 새로운 자유를 가져다 줍니다. 또한, 블록체인은 스마트 계약과 같은 흥미로운 개념을 도입한 이더리움과 같은 분산 컴퓨팅 기술을 혁신시켰습니다.

먼저 블록이 무엇인지 정의해봅시다. 블록체인에서블록은 타임스탬프인덱스를 저장합니다. 각 블록은 무결성을 위한 자체 해시를 갖습니다. 비트코인과 같이블록의 해시는 블록의 인덱스, 타임 스탬프, 데이터이전 블록 해시를 암호화 하는 해시입니다.

import hashlib


class Block:
    def __init__(self, idx, ts, data, pre_hash):
        self.idx = idx
        self.ts = ts
        self.data = data
        self.pre_hash = pre_has
        self.hash = self.hash_block()

    def hash_block(self):
        sha256 = hashlib.sha256():
        sha256.update(
            str(self.idx) +
            str(self.ts) +
            str(self.data) +
            str(self.pre_hash)
        )
        return sha256.hexdigest()

멋지네요! 블록체인 자료구조를 만들었고, 블록체인만들것이며, 실제 체인에 블록을 추가해야 합니다. 앞에서 말했듯이, 각 블록체인은 이전 블록정보가 필요합니다. 그런데

번째 블록에는 어떻게 이전 블록의 정보를 담을 수 있을까요?

첫번째 블록은 특별하며, 이는 Genesis Block 라고 부릅니다. 대부분 Genesis Block수동으로 추가되거나, 추가되게 하는 고유한 로직을 갖습니다.

우리는 Genesis Block반환하는 함수를 만들 것이며, Genesis Block인덱스 0, 임의의 데이터, 임의의 이전 블럭 해시 값을 갖습니다.

from datetime import datetime


def create_genesis_block():
    return Block(0, datetime.utcnow(), "Genesis Block", "0")

이제 우리는 Genesis Block만들있게 되었으므로, 후속 블록들을 생성하는 함수가 필요합니다. 이 함수는 블록체인의 이전 블록을 매개변수로 받고, 생성될 블록에 필요한 데이터를 만든알맞는 데이터와 함께 블록을 반환합니다. 새로운 블록이 이전 블록 정보를 해시할때, 새로운 블록과 블록체인의 무결성증가합니다. 이러한 작업이 없다면, 외부자가 과거의 정보를 바꾸거나 그들 소유의 새로운 정보로 이전의 블록체인을 위변하기 쉬워 집니다. 이러한 해시 체인은 암호화 증명을 수행하고, 블록체인에 블록이 추가될때 블록이 교체되거나 제거 되는 것을 보증합니다.

from datetime import datetime


def next_block(pre_block):
    idx = pre_block.idx + 1
    ts = datetime.utcnow()
    data = "Hey! I'm %d block " % idx
    hash_ = pre_block.hash
    return block(idx, ts, data, hash_)

이제 우리의 블록체인을 만들수 있습니다. 여기서 블록체인은 파이썬 리스트 입니다. 리스트의 첫번째 요소는 Genesis Block 이며, 후속 블록 추가가 필요합니다. for loop사용하여 20개의 새로운 블록을 추가해 봅시다.

blockchain = [create_genesis_block()]
pre_block = blockchain[0]


num_of_blocks_to_add = 20


for _ in range(0, num_of_blocks_to_add):
    block_to_add = create_next_block(pre_block)
    blockchain.append(block_to_add)
    pre_block = block_to_add

    print("Block #{} has been added to the blockchain!".format(block_to_add.idx))
    print("Hash: {}\n".format(block_to_add.hash))

우리가 지금까지 만들 것을 테스트봅시다.

$ python blockchain.py
Block #1 has been added to the blockchain!
Hash: efb894d339ab1e272641676758e1a5b5cbc5b82fd3c069c98a7d7338f8aa5944

Block #2 has been added to the blockchain!
Hash: 1d49888f46aafeaeb56738f115b0572592089316895736f43e254c7906bf6a50

Block #3 has been added to the blockchain!
Hash: b20b257dbd350c2097ebcfca70e7890c6552b79857e6306b3d549576d833e2fa

...(중략)

Block #19 has been added to the blockchain!
Hash: 11643f989f71121cdba4a9cc180890da75bd875505f736119cf6a32e81a9dba2

Block #20 has been added to the blockchain!
Hash: 43380ce50d045f4f30d126ff3a50ee3b1d4d039c7c55c4c9305ea165c48392fa

블록체인이 작동합니다! 더 많은 정보를 콘솔에 확인해보고 싶다면, 완성된 코드수정하고 출력해보세요.

우리의 블록체인을 실제 상용 블로체인들 처럼 확장하기 위해서는 서버 계층과 같은 기능들을 추가해야만 합니다. 이는 체인의 변경 사항을 추적하고, 한정된 시간에서 추가될 블록의 수를 제한하는 작업증명 역할을 합니다.

기술적으로자세히 알고 싶다면, Bitcoin Whitepaper참고하세요.

blockchain bitcoin cryptocurrency python
16/1/2018

Understanding decorator and closer on the Python

def deco1(deco_args, ):
    print('deco1 s')
    def deco1_inner(func):
        print('deco1_inner s')

        def wrapper(*args):
            print('deco1.wrapper')
            print('deco_args: ', deco_args)
            return func(*args)

        print('deco1_inner e')
        return wrapper

    print('deco1 e')
    return deco1_inner


def deco2(func):
    print('deco2 s')

    def wrapper(*args):
        print('deco2.wrapper')
        return func(*args)

    print('deco2 e')
    return wrapper


@deco2
@deco1(['name', 'age', 'sex'])
def origin_func(*args):
    print('origin_func s')
    print('origin_func args:', args)
    print('origin_func e')


if __name__ == '__main__':
    origin_func(*['hello', 'selo'])
decorator closer python
16/1/2018

PEP8 Main Concept

Introduction

This document gives coding conventions for the Python code comprising the standard library in the main Python distribution.

문서는 파이썬 배포판 표준 라이브러리를 구성하는 파이썬 코드의 코딩 컨벤션을 제공합니다.

This style guide evolves over time as additional conventions are identified and past conventions are rendered obsolete by changes in the language itself.

스타일 가이드는 시간이 지남에 따라 발전합니다. 추가적인 컨벤션이 명시되거나 언어의 변화로 과거 컨벤션이 필요없을갱신됩니다.

Many projects have their own coding style guidelines. In the event of any conflicts, such project-specific guides take precedence for that project.

A Foolish Consistency is the Hobgoblin of Little Minds

One of Guido’s key insights is that code is read much more often than it is written. The guidelines provided here are intended to improve the readability of code and make it consistent across the wide spectrum of Python code. As PEP 20(Zen of Python) says, Readability counts.”

One of Guido’s key insights is that code is read much more often than it is written. 우리는 코드를 작성하기보다는 훨씬많이 읽는다.” by Guido

A style guide is about consistency. Consistency with this style guide is important. Consistency within a project is more important. Consistency within one module or function is the most important.

However, know when to be inconsistent — sometimes style guide recommendations just aren’t applicable. When in doubt, use your best judgment. Look at other examples and decide what looks best. And don’t hesitate to ask!

python pep pythonic coding convention
15/1/2018

pyenv-vritualenv install and venv setup

clone pyenv-virtualenv
git clone https://github.com/pyenv/pyenv-virtualenv
$ brew install pyenv-virtualenv
add following script to your shell profile
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
check the versions installed
$ pyenv versions
* system (set by /Users/selochanlee/.pyenv/version)
install specific version
# check the installable version list
$ pyenv install --list
...
# install specific version
$ pyenv install 3.6.1
...
# confirm it whether installed or not
$ pyenv versions
...
create virtualenv with pyen and activate it
$ pyenv virtualenv 2.7.13 <venv_name>
...
# activate the installed version
$ pyenv activate <venv_name>
...
python pyenv virtualenv
12/1/2018

3분 비트코인 개요

비트코인은 분산화암호화 화폐이자 결제 시스템이다.

1. 분산화

중앙은행 등의 신뢰받는 제3자(TTP: Trusted Third Party)가 필요없이, (신뢰) 프로토콜을 따르는 분산화된 컴퓨터 네트워크에 의해 발행되고, 거래가 검증된다.

  • 인간이 하는 모든 거래는 신뢰기반. 현 시대는 TTP가 개인의 신뢰를 검증한다. 하지만 비트코인은 TTP없이 신뢰검증이 이루어 질 수 있다.
  • 기존 시스템은 신뢰를 획득하는데 너무비용이 든다. 분산화된 시스템 비트코인은 TTP에게 지불하는 신뢰를 얻기 위한 비용을 엄청나게 감소시킨다.
  • 네트워크에만 연결가능하면 은행이나 정부와 같은 중앙기관 없이 거래가 가능해진다.
  • 분산화로 인해 비트코인은 기존시스템을 혁신할 조건들을 갖게된다.

2. 암호화

비트코인은 암호학적 원리에 기반하여 거래를 확인하고 기록한다. 구체적으로는 공개키 암호화를 사용하여 거래에 대한 검증과 인증을 수행하며, Hashcash(SHA-256)을 사용한 작업증명(PoW: Proof of Work)을 통해 블락체인의 동기화에 필수적인 연산작업의 양을 측정검증한다.

  • 블락들은 이전 블락과 연결되어 블락 체인을 구성한다. 거래를 해킹하기 위해서는 거래내용이 기록된 블락을 해킹해야하는데, 모든 블락은 연결되있음으로 해킹이 불가능해진다.

3. 화폐

화폐의 3대 기능을 수행한다. 거래의 수단, 가치의 저장, 가치의 척도 기능을 수행한다.

  • 다른 화폐와 마찬가지로 공급과 수요에 의해 가격이 측정된다.
  • 화폐의 효율성 측면이 매우 높다.
  • USD, KRW같은 법정화폐와 같이 공급이 무한정 가능한 인플레이션 화폐와 달리, 발행 총량이 정해진 디플레이션 화폐이다.

4. 결제 시스템

비트코인은 화폐인 동시에 Visa와 같은 결제 시스템으로 비트코인으로 이루어지는 거래를 안전하게 처리한다.

  • 비트코인은 금과 같은 화폐이자 비자, 마스터카드, 은행시스템과 같은 결제시스템이기도 하다.

내용은 비트코인 개요 강좌 | block 2 | 블록체인ers | The Blockchainers 영상을 토대로 요약정리한 내용입니다.

Reference

비트코인 개요 강좌 | block 2 | 블록체인ers | The Blockchainers

bitcoin blockchain cryptocurrency