여러 사람과 협업하거나 랩탑과 데스크탑 코드를 동기화 할 때 VCS는 유용하게 사용됩니다. 이번 포스팅에서는 안드로이드를 개발 할 때, Github를 어떻에 연동하는지 알아보려고 합니다. Github에 대해서는 다음에 자세히 포스팅하겠습니다.

 

우선 Git계정이 있어야 겠죠?

 

여기서 깃허브 계정을 만들어줍니다.

https://github.com

 

Build software better, together

GitHub is where people build software. More than 36 million people use GitHub to discover, fork, and contribute to over 100 million projects.

github.com

 

 

 

깃허브 계정을 만들었으면, Git을 설치합니다.

Git은 이쪽에서 다운 받을 수 있습니다. 윈도우/맥 자신의 운영체제에 맞게 다운받아주세요

https://git-scm.com/downloads

 

 

다음으로 Android Studio를 열어줍니다.(Android Studio를 실행한 상태로 Git을 설치했다면 다시 끄고 실행해주세요. 간혹 잘 안되는 경우가 있습니다.)

 

그리고 VCS -> Create Git Repository 를 눌러서 자신의 Git에 새 저장소를 생성하도록 합니다.

VCS Root를 생성할거냐는 질문에는 Yes를 해주세요

 

아직 안드로이드 스튜디오와 깃허브 계정 연결을 안했습니다. 

File -> Settings 에 들어갑니다.

그리고 Version Control -> GitHub에서 위에서 생성한 깃허브 계정을 추가합니다.

 

완료되었으면 Apply, Ok를 누르고 나갑니다.

 

좌측 상단 Android라고 되었는 바를 Project로 바꾸고

 

Project 우클릭해서 GIt -> Add를 통해 깃에 업로드 하기 위한 준비상태로 만듭니다.

 

그리고 깃허브에 현재 프로젝트를 연동합니다.

 

 

그리고 상단의 Commit 버튼을 누릅니다.

Commit and Push 를 해주면 깃허브에 올라가게 됩니다.

'좌뇌 > TOOL' 카테고리의 다른 글

대용량 문서(Text)파일 읽기  (0) 2019.03.08
Psexec 설치 및 사용법  (2) 2019.01.28

윈도우에서 대용량 텍스트 파일을 읽으려다가 실패를 할 경우에 'Universal Viewer' 프로그램을 추천합니다.


4.2.2 버전부터 무료로 사용가능합니다. 



Universal Viewer 홈페이지

'좌뇌 > TOOL' 카테고리의 다른 글

안드로이드 - 깃허브 연동하기  (0) 2019.04.28
Psexec 설치 및 사용법  (2) 2019.01.28

I/O 모델에서 시스템 콜을 기다리는 동기 모델과 시스템 콜을 기다리지 않고 다음 코드를 수행하는 비동기 모델 두 가지가 있다.

Blocking Socket

유저레벨에서 I/O 작업을 수행할 수 없다. 커널레벨에서 I/O 작업을 요청하고 return 이 오기까지 대기하는 것이 Blocking Socket 의 방법이다. 따라서 유저프로세스는 커널의 응답이 오기까지 Block 상태로 있는데 이럴 경우 CPU를 효율적으로 사용하지 못하게 된다. 또한 Block되어 클라이언트의 요청이 동시에 올 경우 빠르게 처리할 수 없게 된다. 그래서 멀티스레드를 통해 각 유저별로 스레드를 할당하여 처리하는 방법이 사용된다. 그러나 이런 방법을 사용하게되면 Context Switching이 빈번하게 일어나게 된다는 문제가 있다.



Non-Blocking Socket

I/O 요청을 보내고 유저 레벨 프로세스를 중단시키지 않는 방식이다. 커널에게 I/O 요청을 보내고 작업을 이어서 수행할 수 있다. 즉 멀티스레드를 사용하지 않고도 다른 작업을 할 수 있다. 다만, 커널에 system call을 한 번만 하는 것이 아니라 주기적으로 커널 메모리를 확인하여 받은 데이터를 확인하고 데이터가 있다면 복사하여 가져오는 방식이다.



[Reference : https://www.codeblogbt.com/archives/303473]


문제 설명

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.

  • 구조대 : 119
  • 박준영 : 97 674 223
  • 지영석 : 11 9552 4421

전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <string>
#include <vector>
#include <unordered_map>
using namespace std;
 
bool solution(vector<string> phone_book) {
    // 1. string, int형태의 unordered_map 선언
    // 2. 모든 전화번호를 unordered_map에 삽입
    // 3. 현재 비교하는 번호의 substring 을 순회하며 unordered_map을 검사한다.
    // 4. 비교과정에서 해시가 중복되고, 서로 다른 숫자라면 false 리턴
    // 5. 문제가 없었다면 true 리턴
    unordered_map<stringint> phoneMap;
    for(int i = 0; i < phone_book.size(); i++)
    {
        phoneMap[phone_book[i]] = 1;
    }
    
    for(int i = 0; i < phone_book.size(); i++)
    {
        for(int j = 0; j < phone_book[i].length(); ++j)
        {
            if(phoneMap[phone_book[i].substr(0,j)] != 0)
            {
                return false;
            }
        }
    }
    return true;
}
cs

'좌뇌 > 알고리즘' 카테고리의 다른 글

백준 - 슈퍼마리오  (0) 2019.08.28

인라인 함수


인라인 함수는 C/C++ 에서 사용할 수 있는 기능이다. 인라인으로 명시된 함수는 호출된 함수 부분을 코드로 치환하여 컴파일된다. 따라서 프로그램 실행 중, 호출 함수의 주소로 점프하고 다시 돌아오는 방법을 사용하지 않게 된다. 코드가 호출부에 치환하여 삽입되므로 함수 주소 이동이 없기에 속도의 면에서 유리하다.


사용법 


#include <stdio.h>


inline void print()

{

    printf("Hello, world");

}


int main()

{

    print();

    return 0;

}

 

위와같이 함수 앞에 inline을 명시하면 된다.


위 함수는 컴파일러를 통해 아래처럼 바뀌어 동작한다.


int main()

{

    printf("Hello, world");

    return 0;

}



그러나 최신 컴파일러의 경우 inline이 붙지 않아도 자동 인라이닝을 하는경우도 있다. 반면 인라이닝을 거부하는 컴파일러도 있다.

Psexec 란?


원격으로 pc를 제어하는 프로그램에 여러가지가 있지만, 대부분 클라이언트 pc에 프로그램을 설치해야하는 불편함이 있다. Pxexec 는 cmd 로 원격제어를 할 수 있는 경량 원격 제어 프로그램이다.

원격으로 정해진 시간에 프로그램을 제어하고 프로그램을 실행시킬 수 있다. 서버 패치 자동화 같은 경우에 사용하기도 한다.


설치


다운로드 링크 : https://docs.microsoft.com/en-us/sysinternals/downloads/psexec 에 들어가서 설치할 수 있다.


압축을 해제하고 PSTools 폴더를 C:\Windows\System32 디렉토리에 복사한다.


Psexec를 사용하기 위해 다음과 같은 설정을 확인해야 한다.



1. target pc 에서 PIC$ , ADMIN$ 시스템 기본을 포함하는지 확인한다.

2. UAC 가 꺼져있는지 확인한다.

3. TCP 445 포트를 사용해야 하므로 해당 포트가 오픈되어 있는지 확인한다.



cmd 창에서 net share 명령어를 입력하고 PIC$ , ADMIN$를 확인한다.





https://zetawiki.com/wiki/%EC%9C%88%EB%8F%84%EC%9A%B0_UAC_%EB%81%84%EA%B8%B0 링크를 통해 UAC 끄는 법을 참고한다.


그리고 다음 명령어를 관리자권한으로 실행하여 TCP 445 포트를 Open할 수 있다.



netsh advfirewall firewall add rule name="TCP-445" dir=in action=allow protocol=tcp localport=445


이제 원격 cmd 창을 띄운다.


원격 pc 를 제어하기 위해서는 target pc 의 user name, password, ip 번호 가 필요하다.


다음 명령을 통해 원격 pc에 cmd 창이 띄워지는 것을 확인할 수 있다.



PsExec.exe -u [user name] -p [password] [ip] cmd



ex) PsExec.exe -u Scott -p hello1024 \\192.168.0.66 cmd

'좌뇌 > TOOL' 카테고리의 다른 글

안드로이드 - 깃허브 연동하기  (0) 2019.04.28
대용량 문서(Text)파일 읽기  (0) 2019.03.08

블록체인

블록체인은 관리 대상 데이터를 '블록'이라고 하는 소규모 데이터들이 P2P방식을 기반으로 생성된 체인 형태의 연결고리 기반 분산 데이터 저장환경에 저장되어 누구도 임의로 수정될 수 없고 누구나 변경의 결과를 열람할 수 있는 분산 컴퓨팅 기술 기반의 데이터 위변조 방지 기술이다. 이는 근본적으로 분산 데이터 저장기술의 한 형태로, 지속적으로 변경되는 데이터를 모든 참여 노드에 기록한 변경 리스트로서 분산 노드의 운영자에 의한 임의 조작이 불가능하도록 고안되었다. 잘 알려진 블록체인의 응용 사례는 암호화폐의 거래과정을 기록하는 탈중앙화된 전자장부로서 비트코인이 있다. 이 거래 기록은 의무적으로 암호화되고 블록체인 소프트웨어를 실행하는 컴퓨터상에서 운영된다. 비트코인을 비롯한 대부분의 암호화폐들이 블록체인 기술 형태에 기반하고 있다.

최근 JTBC에서 암호화폐를 주제로 토론을 진행했다. 진행 중, 정재승 교수측의 "암호화폐와 블록체인은 분리하는 것은 어렵다"와 유시민 작가의 "암호화폐와 블록체인을 분리하여 블록체인기술 육성이 가능하다" 라는 의견이 대립했다. 과연 블록체인만을 가져와서 따로 기술육성하는 것이 가능할까?


블록체인은 퍼블릭 블록체인, 프라이빗 블록체인, 컨소시엄 블록체인 이렇게  3가지로 나눌 수 있다.


퍼블릭 블록체인 :  누구든지 열람이 가능한 공개된 장부 개념의 블록체인으로 채굴자들의 해쉬파워(컴퓨팅 파워)로 검증 및 트랜젝션이 이루어 진다. 개인이나 한 단체가 통제하기 힘들기때문에 탈중앙화, 분권화된 시스템이다.


프라이빗 블록체인 : 개인이나 단체가 모든 권한을 가진 형태의 블록체인으로 다른 노드가 네트워크에 참여하기 위해서는 별도의 허락이 요구된다.


컨소시엄 블록체인 : 미리 선정된 노드들에 의해서 장부가 검증되는 반 중앙형 블록체인이다. 블록체인 열람 권한을 공개할 수 도 있고 선택에 따라 비공개 할 수 도 있다. 주로 금융과 관련된 암호화폐(Ripple 등)에 적용된다.

퍼블릭 블록체인의 경우 채굴자들이 참여하여 각 트랜젝션들을 검증하고 수행되도록 한다. 이 과정에서 많은 양의 컴퓨팅 파워가 필요로 하게 되는데, 이에 따른 보상으로 암호토큰을 지급하게 된다.(그 누구도 보상없이 이런 행위를 하지 않기 때문이다.) 따라서, 퍼블릭 블록체인을 사용하게 되면 암호화폐의 개념을 분리하기 힘들어진다.

토론에서 언급된 한교수의 인공지능 차량에 블록체인을 접목한 예시는 프라이빗 블록체인이나 컨소시엄 블록체인과 같은 폐쇄형을 말하는 것 같다. 폐쇄형 블록체인의 경우 암호화폐가 필수적이지 않다.



JTBC 동영상 링크: https://www.youtube.com/watch?v=GfaQgl50Mv4





이더리움(Ethereum)

이더리움은 2015년 7월 30일 비탈릭 부테린(Vitalik Buterin)이 개발하였다. 비탈릭 부테린은 가상화폐인 비트코인에 사용된 핵심 기술인 블록체인 화폐 거래 기록뿐 아니라 계약서 등의 추가 정보를 기록할 수 있다는 점에 착안하여, 전 세계 수많은 사용자들이 보유하고 있는 컴퓨팅 자원을 활용해 분산 네트워크를 구성하고, 이 플랫폼을 이용하여 SNS, 이메일, 전자투표 등 다양한 정보를 기록하는 시스템을 창안했다. 이더리움은 C++, 자바, 파이썬, GO 등 주요 프로그래밍 언어를 지원한다.-위키백과

비트코인은 결제나 화폐의 용도에 집중하는 반면, 이더리움은 결제뿐만 아니라 계약, SNS, 이메일, 투표 등 다양한 애플리케이션을 블록체인 위에서 운영할 수 있도록 한다. 이더리움 위에서 동작하는 앱을 DApp(디앱)이라 부른다.

그렇다면 이런 다양한 DApp들은 이더리움 위에서 어떻게 동작할까?


이더리움 창시자 비탈릭 부테린


바로 스마트 계약(Smart Contract)를 통해 동작하게 된다. 가령 우리는 축구경기의 내기에서 패한사람이 '나는 내기를 한 적이 없어' 라고 부인 할 수 있다. 그래서 우리는 제 3자인 중계인을 이용하게 된다. 이더리움은 이 제 3자인 중계인 역할을 대체하고자 한다. 이더리움을 이용하면, '내일 아스널이 축구경이에서 이기면 A가 B에게 500원을 이체 한다.' 가 중계인 없이 가능하게 된다.

이더리움은 비트코인의 블록체인 구조를 응용하였고 이를 통해 스마트 계약을 가능하게 했다.

이더리움의 트랜젝션에는 다음과 같은 값들을 포함하고 있다.


*메시지 수신처
*발신처를 확인할 수 있는 서명
*발신처가 수신처로 보내는 이더의 양
*선택적(optional) 데이터 필드
*STARTGAS 값: 트랜젝션 실행이 수행되도록 허용된 최대 계산 단계수
*GASPRICE 값: 매 계산단계마다 발신처가 지불하는 수수료

처음 세 개의 값들은 코인들이 보통 가지는 값들이다. 네 번째에 있는 데이터 필드에는 컨트랙트가 수행할 코드를 가지고 있다.  DApp 개발자는 의뢰인으로 부터 트랜젝션 요청이 들어오고 이를 처리할 내용을 작성하여 데이터 필드에 넣게 된다. 위 의 예로 들면 '아스널이 경기에서 이겼는지 확인하고 조건부에 따라 돈을 이체한다.'는 코드가 이 곳에 들어가게 된다.


이때, 데이터 필드의 코드에 잘못된 코드나 무한루프에 빠질 수 있는 코드에 대비하여 다섯 번째의 STARTGAS라는 값이 필요하게 된다. 코드에서 한 계산당 1gas가 사용되는데, STARTGAS는 사용가능한 gas의 수를 의미하고 이를 통해 계산 낭비를 방지한다.



이더리움은 APPLY( )라는 상태 전이 함수를 통해 트랜젝션을 검증하고 수행한다.

APPLY(S, TX) -> S`

컨트렉트 코드 전부 gas가 소모될 때까지 수행하는데, gas가 도중에 부족하다면 수수료 지불을 제외하고 모두 원상태로 되돌린다. 이 때, 수수료는 채굴자가 가져가게 된다. 코드를 수행하고 남은 gas는 다시 발신처에 되돌려준다. 이더리움의 트랜젝션이 오류를 반환할 경우는 다음과 같다. 트랜젝션 형식, 서명, 발신처의 Nonce 일치에 문제가 있다면 오류를 반환한다. 또한 발신처의 잔고가 부족할 때 오류를 반환한다.

채굴 알고리즘도 비트코인과는 조금 다르다. 비트코인은 SHA-256 기반의 채굴방식인 반면, 이더리움은 Ethash 알고리즘을 사용하는데, 이는 무작위로 선택 된 최근 몇 개의 블록내역을 해싱작업하고 결과 값을 내놓는 것이다. 기존 비트코인의 채굴방식의 문제점인 'ASIC에 의한 채굴 장벽'을 낮추기 위해 고안되었다.


출처 및 참고자료: Ethereum white paper




비트코인(Bitcoin)

 블록체인 기술을 기반으로 만들어진 온라인 암호화폐이다. 2008년 10월 사토시 나카모토라는 가명을 쓰는 프로그래머가 개발하여, 2009년 1월 프로그램 소스를 배포했다. 중앙은행이 없이 전 세계적 범위에서 P2P 방식으로 개인들 간에 자유롭게 송금 등의 금융거래를 할 수 있게 설계되어 있다. -위키백과

비트코인의 기술의 핵심은 역시 블록체인이다. 블록체인을 이해하기 전에 알아야할 용어 몇가지 소개한다.

1) 공개키 암호화 방식



공개키 암호방식은 두 개의 키를 이용한다. 하나는 비밀키이고 또 하나는 공개키 이다. 공개키는 말 그대로 누구나 확인할 수 있고, 비밀키는 자신 이외에 아무도 모른 다는 것을 전제로 한다. 평문을 공개키로 암호화 하면 복호화는 개인키로만 가능하다. 따라서 A가 B에게 문서를 보낼 때, B의 공개키로 암호화 하여 보내고 B는 암호화된 문서를 자신의 개인키로 복호화 하여 내용을 확인 할 수 있다. 마찬가지로 B가 A에게 문서를 보낼 때는 A의 공개키로 암호화 한다.

 

2) 디지털 서명


서명은 '행위자가 자기의 동일성을 표시하고 책임을 분명하게 하기 위하여 성명을 쓰는 일'을 의미한다. 즉 자신이 했음을 보증하는 것을 말한다. 도장, 싸인과 같은 것이 알날로그 서명의 예이다. 그렇다면 디지털 상에서 어떤 행위를 자신이 했음을 보증하는 방법이 무엇일까? 바로 디지털 서명이다.

 



 서명은 위에서 설명한 공개키와 개인키가 사용된다. 평문을 M, 해쉬함수를 H, 암호화를 E, 복호화를 D라고 할때, 서명이 필요한 평문을 전송을 위해 개인키로 암호화 한 E[H(M)] 의 암호문을 만든다. 그리고 M과 E[H(M)] 를 함께 전송한다. 받는이는 E[H(M)] 을 보낸이의 공개키로 복호화 한 D[E[H(M)]] = H(M)  ‥‥‥ (1) 을 만들고, 같이 전송받은 평문에 해쉬함수를 취한 H(M) ‥‥‥ (2)를 만들고, (1) 과  (2)를 비교하여 일치하는지 검사한다. 이로써 전송한 사람이 작성하였음을 검증하고 중간에 변조되지 않았음을 확인할 수 있다.  이러한 디지털 서명은 우리가 많이 사용하는 공인인증서에 적용되고 있다.


비트코인

이제 비트코인의 시스템을 알아보자. 비트코인을 좀 들어본 사람이면 트랜젝션(Transaction)이라는 용어를 들어보았을 텐데, 간단하게 말하면 비트코인 거래내역 단위를 의미한다. A가 B에게 1BTC를 전송하면 하나의 트랜젝션이 발생하게 된다.

이때, 비트코인은 이러한 트랜젝션 중 위조된 트랜젝션, 잘못된 트랜젝션, 중복된 트랜젝션 등을 자체적으로 검증하는 시스템을 가지고 있다.  이 원리는 아래와 같다.


'n-1번째의 트랜젝션과 받는이의 공개키'를 송신자의 개인키로 서명한다. 이로 써 누구나 n-1번째 사람이 n 번째 사람에게 이체했음을 'n-1번째 사람의 공개키'로 검증할 수 있다. 이런 구조가 끊임 없이 반복되고 있다.

그러나 누군가 나서서 이러한 검증연산을 컴퓨터로 하기 전에는 옳은 트랜젝션인지 알 수 가 없다. 그래서 비트코인에 채굴이라는 시스템이 있다.



 위 그림에서 Tx는 각 트랜젝션을 의미한다. 블록에는 검증해야할 여러 트랜젝션들과 이전블록의 해쉬값, 타임스탬프가 들어간다. 이때, (이전 해쉬값, 트랜젝션 루트, 타임스탬프, Nonce)에 해쉬함수를 취해 E보다 작은 값을 가지게 하는 Nonce를 찾는 것이 채굴의 과정이다. 여기서 E는 목표 값(현재 기준 약 2^192)보다 낮은 값이 나올 때까지, 'SHA256 해싱'을 반복한다. 이를 만족하는 Nonce값은 여러개가 나올 수 있는데, 해쉬결과를 더 작게하는 Nonce가 우선순위를 갖는다.

이러한 블록은 10분에 1개씩 생겨나게 되고 블록의 Nonce를 찾은 채굴자에게 비트코인 보상이 주어지게 된다. 처음에는 블록당 50개의 비트코인이 보상으로 주어졌으나 210,000개의 블록마다 보상에 반감기가 적용되어 2013년에는 25개의 블록이 보상으로 주어졌고, 2020년에는 6.25개의 비트코인이 보상으로 주어질 것으로 본다. 비트코인의 총 발행량은 2100만개로 제한되어있어서 2140년쯤 모두 채굴되지만, 거래 수수료 또한 채굴자가 받을 수 있어서 비트코인의 시스템을 지속 될 수 있게 하였다.



DES

블록암호의 일종으로, 미국 NBS (National Bureau of Standards, 현재  NIST)에서 국가 표준으로 정한 암호이다. DES는 대칭키암호이며, 56비트의 키를 사용한다.

64비트 블럭 암호 알고리즘. 56비트 키를 사용(64비트 중 8비트는 parity check로 사용)

라운드 수 : 16


DES 심플버전

IP(Initial Permutation) : 초기 전치

fk : 전위나 전치, 치환 (키 의존적)

SW : 데이터의 두 절반을 상호 교환하는 함수

암호화와 복호화 프로세스는 아래와 같다.




키생성 과정



가운데 키 생성과정 보자. 예를들어 여기서 1 0 0 1 0 0 1 1 1 0 의 10bit 키 입력이 들어가게 되면,


P10


P10에 의해서 0 0 0 1 1  0 1 1 1 0 가 출력된다. 이를 반씩 나누어 0 0 0 1 1 / 0 1 1 1 0 가 되고

P8

P8을 통해 1 1 1 1 1 0 0 0 의 8bit 키 K1이 생성된다.

K2 생성도 이와 같다.

8bit의 평문은 IP를 거치게되는데,



IP



이 과정을 예를 들면, 1 0 1 0 1 1 0 0 이 입력 0 1 1 1 0 0 1 0 가 출력되는 것이다.

fk의 내부는 아래와 같다.




E/P에서는 4bit입력에 대한 8bit출력으로  확장과 치환이 일어난다.

 

여기까지 DES의 심플 버전이었다.

DES의 심플버전은 8비트로 2단계처리 밖에 안하지만, 실제 DES는 64비트, 16단계 처리를 한다. F함수또한 4비트가아닌 32비트연산이다.

'좌뇌 > 보안' 카테고리의 다른 글

블록 암호 기법(Block cipher)  (0) 2018.04.09
AES(고급 암호화 표준)  (0) 2018.04.09

+ Recent posts