1
CREATE TABLE TB_NEW SELECT * FROM TB_OLD

위 명령어는 TB_OLD의 값과 테이블을 복사하지만 AUTO_INCREMENT가 복사되지 않고, 간혹 INDEX가 누락되는 경우가 있다.

COPY STRUCTURE

1
CREATE TABLE TB_NEW LIKE TB_OLD

이 명령어를 사용하면 데이터는 복사하지 않지만, AUTO_INCREMENT, INDEX 등의 형식을 복사할 수 있습니다.

COPY DATA

1
INSERT INTO TB_NEW SELECT * FROM TB_OLD

COPY COLUMN DATA

1
INSERT INTO TB_NEW(COL_NM) SELECT COL_NAME FROM TB_OLD

BASIC STATEMENT

CREATE

1
CREATE INDEX INDEX_NM ON TB_NAME(COL_NAME)

READ

1
SHOW INDEX FROM TB_NAME

DELETE

1
DROP INDEX INDEX_NM ON TB_NAME

BASIC STATEMENT

CHANGE COLUMN DATA TYPE

1
ALTER TABLE TB_NAME CHANGE COL1 COL2 INT

DELETE COLUMN

1
ALTER TABLE TB_NAME DROP COL_NAME

RESET AUTO_INCREMENT

1
ALTER TABLE TB_NAME AUTO_INCREMENT=0

블록체인이란?

블록체인이란 수정 불가능한 분산형 원장을 의미하며, 특정 정보의 목록이 다수의 컴퓨터에 동시에 저장되고 수정될 수 있는 시스템을 의미합니다.
기존의 시스템은 단일 서버에 모든 정보가 저장되기 때문에 서비스 사용자들이 정보를 알 수 없고, 기업이나 혹은 악한 의도를 가진 사용자에 의해 플랫폼이 훼손될 수 있어 안전하지 못했다면, 블록체인은 수정이 불가능하기 때문에 신뢰할 수 있는 특징이 있습니다.

이러한 블록체인은 반드시 BFT를 가져야 하는데

기본 개념

이더리움에서의 기본 단위는 account 이며 이러한 account는 다음과 같이 두 종류로 나뉘게 됩니다.

  1. EOA(External Owned Account)
  2. Countract Account

여기서 EOA란 계정정보를 포함한 계약을 의미하며 외부 사용자가 private key 를 통해 제어합니다.
이러한 EOA 는 Contract Account의 내부 함수들을 사용할 수 있으며 Contract Account의 내부 함수들은 오직 EOA에 의해서만 호출될 수 있습니다.

Install ethereum command line interface (Ethereum CLI)

  1. 윈도우 go-ethereum(geth) 다운로드
    다운로드

  2. geth 실행

    1
    geth console

테스트 네트워크 구축하기

  1. genesis.json 생성하기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    {
    "config": {
    "chainId": 15,
    "homesteadBlock": 0,
    "eip155Block": 0,
    "eip158Block": 0
    },
    "difficulty": "20",
    "gasLimit": "2100000",
    "alloc": {
    "7df9a875a174b3bc565e6424a0050ebc1b2d1d82":
    { "balance": "300000" },
    "f41c74c9ae680c1aa78f42e5647a62f353b7bdde":
    { "balance": "400000" }
    }
    }
  2. 블록체인 초기화 하기

    1
    geth init genesis.json --datadir ethereum_private
  3. geth console 로 geth 노드 열기

    1
    geth --networkid 123 --datadir ethereum_private console
  4. account 만들기

    1
    personal.newAccount("testuser1")
  5. mining 시작하기

    1
    miner.start()
  6. 자신이 위치한 노드 확인하기

    1
    admin.nodeInfo.enode
  7. 다른 노드 연결하기
    위에서 받은 nodeurl을 받아 다른 클라이언트에서 다음 명령어를 실행한다.

    1
    admin.addPeer("_nodeurl_")

이를 통해 노드와 노드가 연결될 수 있다.

  1. 다른 클라이언트들의 로그 확인
    1
    geth console 2>>geth.log

참조 블로그

이더리움 공식 가이드

geth 명령어

geth 가동

1
2
3
geth --datadir ~/.ethereum_private init ~/dev/genesis.json

geth --fast --cache 512 --ipcpath ~/Library/Ethereum/geth.ipc --networkid 1234 --datadir ~/.ethereum_private console

계좌 생성

1
2
personal.newAccount("testuser1")
personal.newAccount("testuser2")

계좌 확인

1
eth.accounts

잔고 확인

1
eth.getBalance(eth.accounts[0])

블록 수 확인

1
eth.blockNumber

채굴 시작하기

1
miner.start()

채굴 정지

1
miner.stop()

트랜잭션 발행

1
2
3
4
5
6
7
8
eth.sendTransaction({from: 'id', to:'id', value:web3.toWei(1,"ether")})
please unlocak account id

or

eth.sendTransaction({from:eth.accounts[0], to:eth.accounts[1], value:web3.toWei(1,"ether")})

트랜잭션 발행하는 계좌의 암호를 입력

geth 기동

1
2
mkdir eth_data
geth --networkid "123" --rpc --rpcaddr "222.239.251.75" --rpcport 8545 --rpccorsdomain "*" --rpcapi "net,eth,web3,personal" --datadir "eth_data" --olympic console

기본 원리

proof of work -> 어려운 문제를 푼 사람이 토큰을 가져간다.
풀기는 어렵지만 증명은 쉬운 해쉬를 사용한다.

컴퓨터는 nonce에 무작위값을 계속 대입하여 해쉬를 풀고 이를 mining 이라고 한다.
mine이 된 이후에는 점점 난이도가 올라간다.

이더리움의 활용

이더리움은 개인과 개인간의 약속에 기반한 모든 경제적 모델을 온라인 상에서 도입하는 것을 매우 간편하게 만들어 준다.
가령 국가가 특정 공약을 내세우고 이를 위한 자금을 이더리움에서 모금한다고 하면, 해당 공약이 이루어지지 않을 경우 스마트 계약에 따라 참여자에게 돈이 재분배 되게 되는 방식을 사용하는 예처럼 스스로에게 약속 불이행시 제약을 둠으로써 신뢰도 높은 거래를 할 수 있다.

즉, 이더리움은 실제 경제모델과 정치모델을 모두 온라인 상에서 신뢰도있게 구현이 가능하다는 측면에서 그 가치가 높다.


해시란?

해시란 탐색, 삽입, 삭제를 모두 O(1) 기대 시간에 수행할 수 있도록 해 주는 기법입니다.
해시는 해시 테이블을 통해 구현되며 해시 테이블은 b개의 버킷 과 버킷 내에 s개의 사전쌍들로 이루어 집니다.
여기서 해시함수 h는 키 값을 특정 홈 주소로 사상 시키는 함수로써 주로 제산 함수 등이 사용됩니다.

h(k) = 0 ~ (b-1)

위 식에서 h(k)를 해시 혹은 홈 주소 라고 부릅니다.

이상적인 조건 하에서 모든 사전쌍들이 모두 홈 버킷에 저장됩니다.

이런 해시 테이블에 있는 쌍의 수를 n 개라 하고, 가능한 전체 키의 총 개수를 T라 할때

키 밀도 = n/T

위 식이 성립합니다.

이러한 해시 함수는 여러 개의 키를 하나의 버킷에 사상시키게 되기 때문에
h(k1) = h(k2) 가 되는 k1과 k2가 존재하게 되고 이 경우 k1과 k2를 h에 대한 동거자라고 부릅니다.

오버플로우 란 어떤 쌍을 삽입 시 홈 버킷이 넘치는 경우를 말합니다.

정적 해싱

오버플로우 처리방법에는 개방 주소법과 체인법 이 있으며, 개방 주소법 에는 선형 조사법, 이차 조사법, 재해싱, 임의 조사법이 있습니다.

오버플로우 처리법

개방 주소법

선형 조사법

선형 조사법 개념도

체인법

선형 조사법을 비롯한 개방 주소법에서는 키를 탐색 할 때 서로 다른 해시 값을 가진 키들과 일일히 비교를 수행하기 때문에 효율이 매우 떨어집니다.
이와 달리 체인법 에서는 ht[i] 가 버킷 i에 연결된 체인들 중 첫번째 블록을 가리키고 있기 때문에, 연결된 체인 내에서만 탐색을 수행하면 되어 속도가 빠릅니다.

체인법 개념도

동적 해싱

재조정을 한 번 할 때마다 오직 하나의 버킷만 재조정함

디렉터리 사용 동적 해싱

디렉터리 미사용 동적 해싱

스택을 활용한 수식의 계산

모든 프로그래밍 언어는 연산 순위를 결정해야한다.
일반적으로 실생활 에서는 x+y 와 같이 연산자를 피연산자 사이에 작성하는 중위 표기법(infix notation) 을 사용하지만, 컴퓨터의 컴파일러는 후위 표기법(postfix notation) 으로 코드를 변환하기에 컴퓨터의 연산과정을 이해하기 위해서 후기 표현법 에 대해 익숙해질 필요가 있습니다.

후위 표기식 연산법

  1. 연산자를 만날때까지 피연산자를 스택에 저장
  2. 연산자를 만나면 연산에 필요한 만큼만 스택에서 가져와 실행하여 연산결과를 다시 스택에 저장

후위 표기식 연산

중위 표기식을 후위 표기식으로 고치는 법

  1. 식을 모두 괄호식으로 고침
  2. 연산자를 모두 해당하는 오른 괄호랑 대체
  3. 모들 괄호를 삭제

그래프 추상 데이타 타입

가령 여러 지점과 그 지점들을 잊는 길들 처럼 현실 세계의 많은 문제들은 그래프 라는 개념을 통해 해결될 수 있습니다.

그래프 G 는 2개의 집합 V와 E로 구성됩니다. V는 공집합이 아닌 정점(Vertice) 들의 유한 집합이며, G는 정점 쌍들의 집합으로 이러한 쌍을 간선 이라 합니다. V(G) 와 E(G)는 각 각 정점과 간선들의 집합을 의미합니다. 그래프는 정점에서 특정 정점으로 가는데에 방향의 개념이 존재하는 경우와 존재하지 않는 경우로 나눌 수 있으며, 이렇게 정점에서 정점으로 이동시 방향이 있는 경우를 방향 그래프(directed graph) 라고 하며, 방향이 없는 경우 무방향 그래프(undirected graph) 라고 합니다.

여기서 정점에 연결된 간선의 수를 차수 라고 하며, Euler는 각 정점의 차수가 짝수 인 경우에만 임의의 정점에서 출발하여 각 간선을 단 한 번씩만 거치고 출발한 정점으로 되돌아오는 길이 있음을 보였으며, 이를 오일러 행로(Eulerian Walk) 라 부릅니다.

그래프 표현법

무방향 그래프의 간선 (u, v)
방향 그래프의 간선 <u, v>

그래프의 표현

인접 리스트 표현 개념도

그래프의 기본 연산

DFS, BFS 를 적용하기 위한 그래프

깊이 우선 탐색(DFS)

DFS 개념도

위처럼 인접 리스트 표현법의 경우 간선의 횟수 만큼만 탐색이 진행되므로, O(e) 의 복잡도를 가진다.
하지만 인접 매트릭스 표현으로 표현한 경우 각 정점마다 다른 정점들과 비교해야 하므로 O(n^2) 의 복잡도를 가진다.

너비 우선 탐색(BFS)

BFS 개념도

시간 복잡도: O(n^2)

신장 트리(spanning tree)

신장 트리란 G의 간선들로만 구성되고 G의 모든 정점을 포함하는 트리를 말합니다.
신장 트리를 만들기 위해서는 DFS 혹은 BFS를 모두 이용할 수 있으며, DFS를 이용하여 만들어진 신장트리를 깊이 우선 신장 트리(depth first spanning tree) 라 하고, BFS를 이용하여 만들어진 신장 트리를 너비 우선 신장 트리(breath first spanning tree) 라 부릅니다.

최소 비용 신장 트리

가중치가 부여된 무방향 그래프의 신장 트리의 비용은 신장 트리를 구성하는 간선들의 비용의 합이 됩니다. 여기서 최소 비용 신장 트리 란 최저의 비용을 갖는 신장트리를 의미합니다.

이 경우 다음의 조건을 만족해야 합니다.

  1. 그래프 내에 있는 간선만을 사용해야 한다.
  2. 정확히 n-1개의 간선만을 사용해야 한다.
  3. 사이클을 생성하는 간선은 사용하면 안된다.

Kruskal 알고리즘

kruskal 알고리즘 개념도

Prim 알고리즘

prim 알고리즘 개념도

최단 경로와 이행적 폐쇄

현대의 많은 지도 시스템들은 임의의 두 특정 지점 사이의 경로를 탐색하는 많은 시스템 중의 일부입니다. 경로 탐색 시스템은 일반적으로 주나 전국의 도로 시스템을 표현하기 위하여 그래프를 이용합니다. 이러한 문제에서 도시 A에서 도시 B로 가려는 운전자는 다음과 같은 사항들이 궁금할 것입니다.

  1. A로 부터 B로 가는 길이 있는가?
  2. A로부터 B로 가는 길이 2갱 이상이라면, 어느 길이 최단으로 가는 길인가?

Dijkstra 알고리즘, 하나의 출발점에서 모든 목표점: 음이 아닌 간선 비용의 경우

다이크스트라 알고리즘

dijkstra 알고리즘 개념도


파일 시스템 구현

운영체제는 파일 내용에 대한 접근을 요청하는 프로세스를 위해 open()과 close() 시스템 호출을 구현합니다.
본 장에서는 파일 시스템 연산을 구현하는데 사용되는 구조와 연산에 대해 알아봅시다.

다음 그림은 파일 시스템에서 디스크메모리 에 어떤 정보들이 들어있는지를 나타내 줍니다.

파일 시스템에서 디스크와 메모리

계층적 파일 시스템 구조

디렉터리 구현

선형 리스트

선형 리스트 디렉터리 개념도

해시 테이블

해시 테이블 디렉터리 개념도

체인 오버플로우 해시 테이블 개념도

디스크 할당

연속 할당

디스크 연속 할당 개념도

연결 할당

디스크 연결 할당 개념도

FAT 개념도

색인 할당

디스크 색인 할당 개념도

색인 블록의 연결 기법 구성

색인 블록의 다중 단계 색인

컴퓨터를 설계함에 있어 위대한 아이디어인 자주 생기는 일을 빠르게(make common cae fast) 를 추구함에 있어 하드웨어 및 소프트웨어 설계자들이 필연적으로 고민하게 된느 문제 중의 하나는 “성능을 개선하려는 나의 노력이 얼마나 효과가 있는지 어떻게 평가할 수 있는가?” 이다.

열심히 성능을 개선하려는 노력을 했다면 그것이 얼마나 효과가 있는지 궁금해 하는 것은 당연하다.
이러한 질문들에 대한 정석적인 해답은 다음과 같다.

“성능을 개선하려는 노력이 얼마나 효과가 있는지는 그 사건이 얼마나 많이 발생하는지와 관련이 있다.”

이러한 법칙은 얼핏 보면 당연해 보이지만 많은 경우 우리에게 명확한 직관을 줄 수 있다.

간단한 예를 통해 Amdahl의 법칙 의 활용을 알아보자.
가령 프로그램의 실행 시간이 100초가 걸리는 데 그 중 80초는 곱하기 계산에 소요된다고 하자. 이 프로그램이 5배 빠르게 실행되기 위해서 곱셈 속도는 얼마나 개선되어야 하는지에 대한 문제가 있다고 하자.

이는 Amdahl 의 법칙 에 의해 다음과 같이 표현된다.

개선 후 실행시간
= (개선에 의해 영향을 받는 실행 시간)/개선의 크기 + 영향을 받지 않는 실행 시간

이 문제의 경우는

개선 후 실행시간 = 20초 = 80초 / n + (100-80)초

즉, 0=80초 / n

이라는 식을 얻을 수 있다.

이는 바로 곱셈의 성능을 백날 개선해 보아도 시스템의 성능을 5배로 올리는 것은 불가능 하다는 깨우침을 우리에게 준다.
이는 일상생활에서 수확체감의 법칙과도 연관되어 있다.

이처럼 Amdahl의 법칙을 통해 어떤 개선안이 전체 성능에 얼마만큼의 성능 개선을 가져다 줄 지를 예측 할 수 있다.
이 법칙은 CPU 성능식과 함께 잠재적 성능 개선율을 평가하는 편리한 도구이다.


Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×