IBM 이 주도하고 있는 Linux Foundation 의 Collaborative Project 인 Hyperledger 프로젝트 발표 후 Github 에 업데이트가 없다가. 조금전인 2016.02.17 오전 11시 경에 README.md 의 업데이트가 있었다.

현재 시점에서 이 HyperLedger TSC(Technical Steering Commitee)는 광범위한 유스케이스와 Value Add 된 솔루션을 올릴 수 있는 블록체인 플랫폼을 지향하고있다.

이 Project 에는 4가지 종류의 Contribution Proposal 이 올라왔다. 아래 제안들은 아직 결정된것이 아니며, TSC 가 열심히 검토해서 결정하겠다고 한다. (그러나 아마도 답은 이미 나와있는상태에서 시작하는 게임 아닐까 싶기도 하다. IBM이 아니겠는가? 아니면 DAH ..? 아니면 적절한 사상들 간의 종합적인 산출물이 나올 수 있을듯 한데..)


Ripple Proposed Contribution

Rippled 는 OSS 로, C++ 로 구현된 2012년 부터 작동중인 Public Blockchain 이며, Cross-Currency 지불을 가능케 하는 플랫폼이다. 주문장(Order Books) 기반으로 이루어지는 빠른 Transaction 과 복잡한 구현을 단순화 하는데에 초점이 맞추어져있다.

분산 원장(Distributed Ledger)기술로 NuDB 라는 고성능의 Key/Value 기반의 DB 를 포함하고 있다. 수 테라바이트의 데이터셋을 최소함의 RAM 소모로 핸들링 하기에 최적화 되어있다. SSD 와 같은 고성능의 I/O 가 필요하다.

https://github.com/ripple/rippled

IBM Proposed Contribution

IBM 은 Open Blockchain (OBC) 라는 이름으로 프로젝트를 하겠다고 발표한바 있고, 2월15일에 0.1.0을 릴리즈 하였다. License 는 Apache 기반으로 진행중이며, Hyper Ledger 프로젝트에 Contribute 하기 위해 오픈소스화 하였다고 한다. 정식으로 Hyper Ledger 프로젝트로 채택되면 IBM 은 이후 Hyperledger 에 집중하고, 아래 Repository 는 IBM 내부적인 필요성에 의해 관리한다고 한다. 언어는 Go 로 개발되어있다.

Open Blockchain 은 여러 산업에서 사용할 수 있게하기위한 목적의 저수준의 Fabric Code 이다. 핵심은 Smart Contract, Digital Assets, Record Repositoroes, Decentralized Network Providing Consensus, Cryptographic Security 이다.

https://github.com/openblockchain


Digital Asset Holdings Proposed Contribution

DAH 의 후보군은 기업을 위한 Blockchain Server 형태로, Client API 를 포함한다. 이 프로젝트도 Hyper Ledger 프로젝트 채택을 위한 목적으로 공개 된 프로젝트이다. 모듈화된 아키텍쳐와 설정 가능한 네트워크 구조는 금융권에 적합한 구조를 위해 설계되었다고 한다. 데이터 백본의 컨셉을 Multi-Organization 레벨로 확장한 것이다. 라이선스는 Apache 라이선이다.

금융권용 답게 Java 기반으로 구현되어있다. 골드만삭스를 비롯 각종 금융권들로 부터 많은 긍정적인 반응과 투자를 받은 회사로 상당히 유력한 후보군이라 볼 수 있다.

https://github.com/DigitalAssetCom/hlp-candidate


Blockstream Proposed Contribution

좀 됐긴 했지만 Elements 라는 이름의 Blockchain OSS 도 있다. Bitcoin 을 확장한 개념으로, Confidential Transactions, Segregated Wirness, Relative Lock Time 등등의 확장 개념이 들어가있다. Bitcoin testnet 과의 Pegging 도 가능하다.

https://github.com/ElementsProject/elements


앞으로 이 4개 Proposal 중에 어떤게 정식으로 Hyper Ledger 의 Codebase 또는 사상으로 채택될지는 모르겠으나 내생각에는 IBM 이 가장 유력하지 않는가 싶다. 애초에 TSC 가 보고있는 관점도 "산업 전반에 걸친" 블록체인 플랫폼이므로 (왠지 IBM 이 만들어낸 기준 스러워도 보이지만) 금융권에서 신뢰받고있는 DAH 의 codebase 또한 무시못할 것으로 보인다.

Hyper Ledger 가 아니더라도, DAH 의 Blockchain 소스가(물론 일부이고 Hyper Ledger 프로젝트 채택 목적이겠지만) 공개되어 올라온것 만으로도 특히 국내 금융권에게는 희소식이 아닐까 싶다.


반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,
불과 며칠 전에 1.1.3 버전이 Release 되었다. 1.1.2 부터 PV62(Protocol Version 62) 와 PV63 을 지원 중이며, 1.1.2 대비 eth Console 과 AlethOne 크래쉬 버그픽스가 있었다. 이 1.1.3 Release Branch 로 빌드 해보기로 한다.

Mac OS X 에서는 그나마 빌드 및 실행이 잘되는 편인데, Windows 빌드는 예전 버전들 부터 잘 되지 않는 편이다. 빌드는 되더라도 기능에 버그가 있거나 하는 경우가 많다.

▌준비할 것

빌드하기 전에 우선 아래 준비사항이 모두 준비되었는지 확인하자.

  1. Windows 7 또는 8 64비트 (32 비트 버전과 Windows 10 은 지원하지 않음)
  2. Git for Windows 1.9.0 이상
  3. 7-Zip 
  4. CMake 3.0 이상
  5. Windows 7 또는 8 SDK 
  6. Visual Studio 2013 Community Edition (Update 5 를 별도로 받아 Build 넘버 12.0.40629.00 이 되도록 한다)
    Visual Studio 2015 는 아직 지원 안함

▌환경 설치

▪ Git 설치

Git 사이트 에서 Git for Windows 다운로드 받고, Git Bash Shell 을 설치하도록 한다.


설치하면 Git Bash 로 실행 되는지 정도는 확인하자.



▪ 7zip 설치

7zip 사이트 에서 최신 exe 버전을 다운로드 한다.


다운로드 받은 exe 파일을 실행하여 원하는 Directory 에 설치한다


그리고 반드시 설치한 디렉토리를 PATH 에 추가해 주어야 한다


위처럼 System 의 PATH 환경변수에 7zip 설치된 경로를 추가 해 주었다.

▪ CMake 설치

CMake 사이트 에서 Latest Release 에서 Installer 버전을 다운로드 받아서 설치한다.


PATH 에 CMake 를 자동 추가하도록 설치 시 옵션을 선택한다.



▪ Windows SDK 설치

Windows SDK 사이트 (7 또는 8.1) 에서 SDK 를 다운로 받아 설치한다.


▪ Visual Studio 2013 Community

Visual Studio 2013 Community 사이트 에서 Installer 를 다운로드 받고 설치한다. 시간이 꽤 걸린다.



위 처럼 Update 5 를 설치하고 있는지 확인한다.

이제 소스를 Checkout 하고 빌드를 해보도록 하자

▌소스 Clone

Git Bash 를 통해 MinGW 의 Bash Shell 로 들어간다.

우선 디렉토리를 아래와 같이 만들었고, project 밑으로 프로젝트를 clone 할 예정이다.
[goodjoon project]$  pwd
/d/ethereum/project
[goodjoon project]$

git 으로 Repository 를 Clone 한다. Submodule 들이 다수 걸려있으므로, submodule 들도 --recursive 옵션으로 모두 가져온다.
[goodjoon project]$
brella.gitproject]$  git clone --recursive https://github.com/ethereum/webthree-umbrella
Cloning into 'webthree-umbrella'...
remote: Counting objects: 71041, done.
remote: Compressing objects: 100% (2/2), done.
Receiving objects:  56% (40071/71041), 16.92 MiB | 2.96 MiB/s

webthree-umbrella 가 clone 되었고, 
[goodjoon project]$  ls -al
total 8
drwxr-xr-x 1 korean44 없음 0 Feb 14 23:16 ./
drwxr-xr-x 1 korean44 없음 0 Feb 14 23:04 ../
drwxr-xr-x 1 korean44 없음 0 Feb 14 23:16 webthree-umbrella/
[goodjoon project]$

webthree-umbrella 해서 git status 를 해보면
[goodjoon webthree-umbrella]$  git status
On branch develop
Your branch is up-to-date with 'origin/develop'.
nothing to commit, working directory clean
[goodjoon webthree-umbrella]$
확인해보면, 위 처럼 develop Branch 에 HEAD 가 있음을 알 수 있다. 그래서, Release 브랜치로 다시 checkout 을 해야한다.

[goodjoon webthree-umbrella]$  git checkout release
M       webthree-helpers
Branch release set up to track remote branch release from origin.
Switched to a new branch 'release'
[goodjoon webthree-umbrella]$  git status
On branch release
Your branch is up-to-date with 'origin/release'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   webthree-helpers (new commits)

no changes added to commit (use "git add" and/or "git commit -a")
[goodjoon webthree-umbrella]$

release Branch 로 checkout 을 하고 status 를 보면, submodule 이 실제로 update 가 안되었기 때문에 modified 된것처럼 나온다. 
Submodule 들도 Update 해주자
[goodjoon webthree-umbrella]$  git submodule update --recursive
Submodule path 'webthree-helpers': checked out '4932539374f9b9ea1030b4514c5292620d55f3c0'
[goodjoon webthree-umbrella]$  git status
On branch release
Your branch is up-to-date with 'origin/release'.
nothing to commit, working directory clean
[goodjoon webthree-umbrella]$

불과 사흘전에 Release 를 해서 그런지 Submodule 들이 대부분 최신 Branch 여서 webthree-helpers 브랜치만 Update 되었다.

▌Dependency 다운로드

Windows 에서 빌드를 하기 위해서는 llvm 및 Qt 을 비롯해 아래와 같은 라이브러리들이 필요하다
boost 1.55.0
cryptopp 5.6.2
curl 7.4.2
jsoncpp 1.6.2
json-rpc-cpp 0.5.0
leveldb 1.2
llvm 3.7.0
microhttpd 0.9.2
OpenCL_ICD 1
qt 5.4.1
miniupnpc 1.9
v8 3.15.9

apt 나 brew, port 가 없는 Windows 에서 일일이 라이브러리를 다운로드 받아 설치하기란 매우 번거로운 일이기때문에 C++DEV 팀에서 간단한 배치를 하나 제공한다.
/d/ethereum/project/webthree-umbrella/webthree-helpers/extdep
위 경로로 가보면 getstuff.bat 파일이 있는데, 이 파일을 실행시키면 모든 dependency 라이브러리들을 다운로드 받는다

[goodjoon extdep]$  ./getstuff.bat
한참동안을 뭔가 잘못된 것 처럼 가만히 있는다. 라이브러리를 하나씩 다운로드 받고 압축 풀고를 반복한다. 4.4GB 를 다운받고 압축 푸느라 수십분 정도 작업이 길어질 수 있으므로 TV나 좀 보다오자.
인터넷 연결만 잘 되어있다면 안될 이유는 없을것이다.

오늘은 너무 졸려서 이만..^^;;
다음은 본격적인 소스 빌드와 오류 해결로 넘어가보겠다.


반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,
이번에는 Activity 를 새로 만들고, 만든 Activity 를 시작하는 방법에 대해 알아본다.

Android 는 Activity 를 시작시킨 때 Intent 를 기반으로 하여 시작시킨다. 이 Intent 에 메인 뷰의 EditText 로 입력받은 String 을 추가하여 새로 만든 Activity 를 시작할 때 넘겨주고, Activity 는 TextView 를 포함하는 Layout (ViewGroup)을 통해 전달받은 메시지를 표시해주는 방식이다.

▌버튼 눌렸을 때 호출 될 메소드 정의하기

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/button_send"
    android:onClick="sendMessage"/>


▌새로운 Activity 실행위한 Intent 생성하기

public void sendMessage(View view) {
    Intent intent = new Intent(this, DisplayMessageActivity.class)// Intent 를 신규 생성, DisplayMessageActivity 를 실행하기 위한 Intent 를 생성함
    EditText editText = (EditText) findViewById(R.id.edit_message)// 현재 Activity 의 OnCreate 에서 처리된 Bundle 의 XML 내에 있는 id 값에 해당하는 View 를 가져옴
    String message = editText.getText().toString()// EditText 의 값 가져옴
    intent.putExtra(EXTRA_MESSAGEmessage)// EXTRA_MESSAGE 를 Key 로 하고 내용을 message 로 하는 데이터를 Intent 에 추가 함. Key-Value Pair 의 extra 를 Intent 에 추가함
    startActivity(intent);
}

public final static String EXTRA_MESSAGE "com.goodjoon.helloandroid.MESSAGE";


▌Activity 추가를 위한 과정

  1. Activity XML 생성
  2. strings.xml 에 Activity Title 추가
  3. Content XML 생성
  4. Android Manifest 에 Activity 등록
  5. Activity 클래스 작성

▌신규 Activity 추가 - Studio 의 New Activity 기능 사용하여 추가하기


원하는 Package 에서 우측클릭>New>Activity>Blank Activity 를 눌러서 Activity 를 추가한다.


Activity 이름을 주고, 중간의 Hierarchical Parent 에서 "..." 을 눌러 메인 Activity 인 HelloActivity 를 선택한다.


Hierarchical Parent

Activity 를 추가할 때 Hierarchical Parent 를 주면, 기본적인 Navigation 동작이 추가된다. up Navigation 버튼이 Navigation Bar 에 추가되고, Back 버튼을 눌렀을 때 Parent Activity 가 호출되는 등의 Action 이 실행된다.

<androidManifest.xml> 내용 중
<activity
    android:name=".DisplayMessageActivity"
    android:label="@string/title_activity_display_message"
    android:parentActivityName=".HelloActivity"
    android:theme="@style/AppTheme.NoActionBar">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.goodjoon.helloandroid.HelloActivity" />
</activity>

위에서 android:parentActivityName=".HelloActivity" 가 추가된 것을 볼 수 있다.
나중에 수동으로 Activity 를 추가하면 저렇게 parentActivity 를 주면 된다.

위 과정으로 추가하면

  1. Activity XML 생성
  2. Content XML 생성
  3. AndroidManifest.xml 에 Activity 등록
  4. string.xml 에 Activity Title 등록
  5. Activity 클래스 추가

와 같은 과정이 자동으로 실행된다

  1. Activity XML 생성


  1. Content XML 생성

Content XML 이 생성되면 아래와 같이 RelativeLayout 요소의 마지막에 android:id="@+id/content" 를 하여 id 를 하나 부여해주어 Code 에서 findViewById() 로 쉽게 Layout 을 갖고오게 하자.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    ...
    android:id="@+id/content">


  1. Activity 클래스에서 메시지 받아 출력해주기

TextView 뷰를 하나 추가하고, Intent 의 Message 를 TextView 에 출력하도록 할 것이다.
Layout XML 에 추가하는 방법 말고, Activity 클래스에서 코드로 추가하는 방법으로 해본다.

일단, 자기 Activity 를 실행시킨 Intent 내에 Extra 데이터(메시지)를 가져오고,
TextView 뷰를 생성한 다음, 이 뷰를 Layout 을 가져와 그 Layout 에 추가하는 작업을 한다.

코드는 아래와 같다. 자동 생성된 Activity 클래스의 onCreate 의 하단에 해당 내용을 추가하면 된다.
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_display_message);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view"Replace with your own action"Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    // Activity 는 자신을 시작시킨 Intent 를 가져올 수 있음
    // Intent 에서 메시지를 가져오도록 함
    Intent intent = this.getIntent();
    String message = intent.getStringExtra(HelloActivity.EXTRA_MESSAGE);

    // TextView Object 를 만든다
    TextView textView = new TextView(this);
    textView.setTextSize(40);
    textView.setText(message);

    // 만들어진 TextView 를 RelativeLayout 에 붙인다
    RelativeLayout layout = (RelativeLayout) findViewById(R.id.content);
    layout.addView(textView);

}


▌실행 결과

 


실행 결과는 위와 같다. 텍스트를 입력하고 "보내기" 버튼을 누르면 Intent 를 생성하여 ExtraData 로 Message 를 추가하고, DisplayMessageActivity 를 생성한 Intent 로 시작시킨다.(실행 보다는 '시작' 이 적합한 단어라고 생각한다)










반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,
 Auto Completion, Code Assist, Code Suggestion, Parameter Info 등등의 이름으로 불리우는 자동 완성 기능. Visual Studio 와 Visual AssistX 플러그인은 아마 현존 최고의 Assist 기능이 아닐까 생각된다. 

 XCode 의 자동완성 기능도 매우 훌륭한 편이며, Eclipse 또한 많이 괜챦아졌다. IntelliJ 를 기반으로하는 Android Studio 의 자동완성 기능이 어느정도일지 궁굼했는데, 잠깐 사용해본 결과 Eclipse 보다는 낫다는 생각이다. ^^

□ TIP - Auto Completion 관련한 단축키들

Auto Completion / Suggestion / Assist 기능들은 IDE 를 쓰는 큰 이유중의 하나이다. Android Studio 는 IntelliJ 기반의 IDE 이며, 아래와 같은 기능들을 제공한다.

- ALT+Enter (Show Intention Action)
Import 되지 않은 클래스를 Import 하려면 이 키를 사용한다. 매우 자주 사용하는 키 이다. 클래스 import 이외에도, 현재 상황에서 무언가 의도한 액션을 수행하고자 하면 가능한 액션들이 보여진다.
단순히 import 를 편하게 하려면 Settings... 메뉴에서, Editor>General 의 Auto Import 기능에서 on the fly 기능들을 켜놓으면 즉시 Import 되도록 할 수 있다.


- Ctrl+Q (Quick Documentation)
현재 Caret 이 위치한 Class 나 method 의 Document 를 보여준다.


- Ctrl+P (Parameter Info)
현재 Method 의 파라미터 정보를 보여준다. Overload 된 Method 의 Parameter Info 까지 모두 한눈에 볼 수 있어서 편리하고 자주쓰는 기능이다.


- Ctrl+Space (Basic Completion)
Basic Auto Completion 기능으로, 입력중인 내용의 자동완성 목록을 보여준다. 가장 많이 쓴다.
그런데 불행하게도 한글 키보드를 쓰는 나같은 경우는 Ctrl+Space 가 "한자" 기능에 키보드 맵핑이 되어있어 이 Basic Completion 기능이 동작하지 않는다. 그래서 나같은 경우는 Ctrl+, 로 변경해서 사용중이다.


- Shift+Ctrl+Space
SmartType Auto Completion 기능으로, Basic Auto Completion 대비 현재 Context 에 더욱 맞는 Type Completion List 를 보여준다는데, 아직까지는 잘 사용하지 않고있다. 향후에 많이 써보면서 더 알아보도록 하겠다.




□ 주의 - 자동으로 import 가 갱신되지 않을 때, 즉시 자동으로 Import 되도록 하는 방법

Eclipse 플러그인으로 동작하던 때에는 사용하는 클래스에 따라 자동으로 import 문도 optimize 해주고 했었는데, 이상하게 Android Studio 는 Optimize Import (Ctrl+Alt+O) 를 눌러도 자동으로 Import 를 시켜주지 않는다.
이럴때에는 Settings... 메뉴에서, 아래 두개 옵션을 체크해주면 일단 해결된다.


이상 단축키와 관련 메뉴에 대해서 살펴보았다. 필요한 때에 적절하게 단축키를 눌러서 생산성 있는 개발이 되도록 하자~


반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,
 Ethereum 의 Github 를 가보면 매우 많은 프로젝트들이 Repository 에 올라와 있는게 보이고, 매우 복잡하게 느껴진다.

 그러나 업데이트 안하고 있는 프로젝트나 다른 프로젝트의 Sub Module 들이 많이 섞여있는 상태이므로 자꾸 왔다갔다 하다보면 별로 복잡하게 느껴지지 않는다.

주요 프로젝트들에 대해서 간단히 설명해본다.

yellowpaper

The "Yellow Paper": Ethereum's formal specification

Vitalik Buterin 이 White Paper 를 쓰고있고, Ethereum 의 사상의 기술적인 Spec 이라고 할 수 있는 Yellow Paper 를 Gavin Wood 가 쓴다. 이 Yellow Paper 는 얼핏 보면 수학공식 같아 보이지만, 말로 표현할때의 해석의 모호성을 줄이기 위해 수학적인 기호를 차용한 정도이다. 복잡한 수식은 없으며 대부분 집합 기호를 통해 개념을 설명한다.

Ethereum 의 중요 개념인 Block, State/State Transition, Transaction, Gas, Contract 등에 대한 동작 방식을 정의해놓았다. Ethereum 내부의 개발자들은 이 Yellow Paper 를 보고 구현한다고는 하지만 사실 이 내용만 보고 그들의 사상을 구현하기에는 부족한 부분들이 매우 많다. 통신, 마이닝, 로직의 흐름 등은 설명되어 있지 않으므로 설계서 보다는 핵심 사상의 정의 수준이라고 해야 하겠다.

go-ethereum

Official golang implementation of the Ethereum protocol

나도 2014년 말 Ethereum 을 접하면서 Go 언어라는것을 처음 알게 되었다. Go 언어는 Chrome 의 V8 엔진 개발에 참여하고 Java Hotspot 컴파일러를 개발한 Robert Griesmer, UTF-8 과 분산 운영체제를 개발한 Rob Pike, UNIX 의 창시자라 불리는 Ken Thompson, 프로그래밍 천재라는 Russ Cox 등의 천재들이 만들어낸 매우 간결하지만 강력한, Google 이 만들어낸 걸작의 언어이다. Ethereum 의 공식 구현체 중 가장 빠르게 버전업이 되는 구현체이며, DApp 클라이언트 플랫폼으로 Go Ethereum (Geth) 를 공식화 하고있다. 코드도 매우 깔끔한 편이다.

webthree-umbrella

The umbrella project for all of C++ Web Three implementation

작년까지만 해도 C++ Ethereum 으로 불리우던 cpp-ethereum 프로젝트가 있었는데, 이 프로젝트가 webthree-umbrella 라는 이름으로 바뀌었고 git repository 구조도 바뀌게 되었다. Ethereum 의 공식 구현체이며 Repository 내 많은 submodule 들이 이 프로젝트에 dependecy 로 참조되고 있다. 나도 비록 근래에는 Java 기반의 Enterprise S/W Architect 를 했지만 2000년 부터 7년 간을 C++ 을 했었기에 주로 이녀석을 분석했었는데, 처음 코드를 보면서 "이게 뭔 C++ 이야?" 라는 생각이 들었는데, boost 라이브러리들을 많이 사용하고, C++ '11 스펙을 사용하는 관계로 C++ 98 스펙에 익숙했던 나에게는 해석에 참 많은 시간이 필요로 하게 하였다. Gavin Wood 의 해커끼(?) 보이는 코드의 복잡함들도 더러 보이며 TrieDB 쪽은 특히 Template Class를 꼬아서 쓰기때문에 해석 중에 컨텍스트를 잃어버리는 경우도 생겼다. 버그도 많은편이고 코드 복잡성은 Top 수준이다. Ethereum 은 C++ Ethereum 을 Backend 용으로 적합하고 Go 보다는 좀더 나은 성능을 원하는 경우에 사용할것을 권고한다. 비교적 자주 업데이트 되는 편이지만 작년 기준으로는 Go 대비 한발 늦는 개발 진행 때문에 Geth 와 함께 코드를 보는 경우도 있었다.

pyethapp

 forked from heikoheiko/pyethapp

이름에서 보이듯이 Python 기반의 프로젝트이다. Ethereum 은 Pyethapp 은 "학습" 목적으로 단정짓는다. (사실 작년 Frontier 발표 전에는 그런 말도 안보이더니..) 성능과 기능 보다는 Ethereum 의 동작 원리를 이해하고 분석하는데에 사용할것을 권고하고 있다. Python 은 언어도 쉬운편이니 Ethereum 의 핵심 메커니즘 맛보기 수준 정도를 원한다면 이녀석으로 시작해보는것도 괜챦을 듯 하다. 상세한 코드 주석이 세심한 배려심을 드러내고있다.

Java implementation of the Ethereum yellowpaper

작년에 파일럿 시스템을 만들 때 codebase 로 활용했던 녀석이다. 지금와서 보면 참 후회스러운 선택이었지만 일단 작년 5~6월 정도에는 매우 Simple 한 코드와 Java 의 간결성 때문에 이녀석을 선택했었다. 그러나 C++ ETH (eth) 와 Geth 대비 확연히 떨어지는 구현도를 보였으며, 심지어 Miner 는 불과 며칠 전에 Homstead Prerelease 버전인 1.1.0 버전에서야 추가 되었다. 공식 구현체가 아니므로 너무 큰 기대는 하지 않는게 상책이지만 요즘은 어떤지 확인이 한번 필요하기도 하다.

alethzero

The AlethZero Hardcore Ethereum Client

C++ Team 이 개발하고 있는 일종의 Debug 툴이다. eth 를 테스트하기에 충분한 기능들이 들어가있고, Qt 기반의 GUI 로 Tx 을 날리거나 Block, Peer, Node, Tx, Contract Code 실행, Mining 상태 등을 보여준다. C++ 팀의 주력 개발 Client 라 보면 된다. 단 Mist 와 같은 DApp Client 가 아니고, eth 의 동작을 테스트하는 목적으로 보면 되는 클라이언트이다. 

mix

The Mix Ethereum Dapp Development Tool

Mix 는 공식적인 Ethereum 의 DApp 개발도구이다. HTML/CSS/JavaScript 기반으로 DApp 을 만들고, Smart Contract 를 개발할 수 있도록 되어있다. Contract Code 를 개발하고 컴파일하고 검증할 때 사용하면 좋으며, 아래 Mist 에서 실행되는 DApp 은 Mix 로 개발하는게 순서상 맞다.

mist

Mist browser

Mist 는 Go 언어로 Go 개발팀이 만들고 있는 일반 End-User 용 Ethereum Client 이다. DApp 을 구동하는 플랫폼이며, Browser 와 유사한(내부적으로 Web View 를 갖는) 클라이언트이다. 웹 엔진과 Geth 가 통합된 형태라고 보면 되며, 향후 Light Weight Client 는 이 mist 형태로 일반 유저에게 배포될 것이다.

solidity

The Solidity Contract-Oriented Programming Language

Solidity, Serpent, LLL 은 Smart Contract 를 기술하는 언어이다. Solidity 는 C++ 팀이 개발하고 있으며, 현재 가장 잘 만들어진 Smart Contract 구현 언어이다. solc 로 Solidity 코드를 컴파일 하면 EVM Code 가 생성되도록 되어있으며, 요즘은 예제들도 상당히 많이 돌아다니므로 배우기가 더 쉬워졌다. 문법은 JavaScript 와 유사하여 러닝커브도 짧은 편이다.

Serpent 도 Smart Contract 기술 언어중에 하나이다. 문법이 Python 매우 유사하다. Solidity 다음으로 많이 사용되나 요즘은 Ethereum 에서도 Solidity 를 많이 밀고있는 상황이라 상대적으로 Serpent 는 약간 뒤쳐지는 느낌이다.

이외에 LLL 과 Mutan 이 있었는데 LLL 은 Low-Level 언어이며 현재는 더이상 발전시키지 않고있는 언어이다. Mutan 은 훨씬 이전부터 지원하지 않고있다. LLL 은 현재도 사용할 수는 있다. OP Code 의 래퍼 정도로 매우 저수준이기 때문에 간단히 코드 짜서 테스트해보고 디버깅 할때에는 LLL 을 사용할 수도 있다.

web3.js

Ethereum Compatible JavaScript API

Ethereum 의 JavaScript API 이다. 내부적으로는 JSON RPC 를 통해 eth / geth 와 통신한다. Geth/Eth 의 Javascript Console 이나 브라우져, Node.js runtime 에서 사용할 수 있는 API 이다. 특히 이 web3.js 의 spec 을 자주 보게 될것인데, ethereum 의 console 의 명령이 frontier 이전 버전은 Command 방식으로 사용하다가, 아예 Command 는 지양하도록 하며 Console 에서 모든 명령은 이 web3 JavaScript API 를 사용하도록 했기 때문이다.

diary

The Ethereum Developer logs

바로 어제 부터 글이 올라오기 시작한다. 개발일지같은 형태로 올라오는데, 급 외부 사람들과의 Communication 에 신경을 쓰고있다. 신임 C++ Team Leader 인 Christian Reitweissner 의 글을 봐도 커뮤니케이션 열심 하겠다고 하는걸로 봐서 내부적으로 뭔가 일이 있었나보다. 앞으로 자주 들러보게 될 것 같다.

wiki

The Ethereum Wiki -

Ethereum 의 기술적인 부분들은 이제 이 Wiki 로 통합되었다. 이전에는 ethereum/ethereum 프로젝트(리파지토리)에 가이드를 올렸는데, 이제는 ethereum/wiki 프로젝트로 옮겨갔다. 좀더 정리되는것 같은 느낌이 나지만 아직도 각 프로젝트 별 문서는 자체 리파지토리 내의 Wiki 를 사용하는 등 산만함이 완전히 가시지는 않았다.


위와 같이 주요 리파지토리(프로젝트) 들에 대해 알아보았다. 앞으로 블로그에서 저 프로젝트들이 종종 언급될 듯 한데 한번쯤 들어가서 Readme.md 파일이라도 읽어보는게 좋겠다는 생각이다.




반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,
 2014년 하반기, Decentralized Computing 에 대한 관심과 Autonomous IoT Device 의 자율적인 협업을 위한 방안을 연구하던 중 당시 비트코인의 핵심 기술로 적용된 Blockchain 기술을 접하게 되었고, 특히 Blockchain 의 Consensus 메커니즘이 디바이스 간 자율적인 협업을 위한 핵심 메커니즘으로 작용할 수 있다는 생각으로 2014년 말 부터 Blockchain 기술을 더 깊이 연구해보게 되었다. IBM 의 ADEPT 컨셉도 이쯔음에 발표되었고 ("Device Democracy 라는 주제로") 마침 유사한 고민을 하던 중 글로벌 기업도 이러한 노력을 하고있다는 데에서 더 신이 나기도 했다.

 2015년 3월 부터는 비트코인에서 사용중인 원시적인 Blockchain 기술을 1.0으로 기준화 하고 Blockchain 2.0 이라 불리우던 Ethereum 을 집중적으로 연구하였고, PoC8 버전을 달리던 C++, Go Ethereum 을 분석하여 당시 매우 덜 구현되어있던 EthereumJ (Java) 를 CodeBase 로 하여 해석된 메커니즘을 Java 로 추가 구현 하였다.

 애초 Ethereum 의 Smart Contract 개념을 가장 중요시하게 보고 있었던터라 약 3개월 뒤에 Solidity 기반의 간단한 Smart Contract Code 를 개발하고, EthereumJ 에 Mining 기능 및 각종 Validation, Networking 을 추가하여 진본 증명 파일럿 시스템을 개발해보았다. 요즘 말하는 Private Blockchain 까지는 아니지만 Local Blockchain 을 구성하여 자체적인 Blockchain 서비스를 시험개발해 본 것이다.

 2016년에 들어서자 한국은행 총장의 신년사에서도 Blockchain이 언급될 만큼, 금융권은 Nasdaq 과 R3CEV 등의 사례를 보며 핀테크를 넘어선 글로벌 미래 금융기술을 준비하는데에 Blockchain 기술을 매우 중요한 요소로 생각하고, 기술을 응용한 비즈니스모델을 만들고자 노력중인것으로 보인다.

 역시나 발빠른 스타트업들은 이러한 금융사로 부터 펀딩을 받기 위해 노력중이나, 사실 기술 보다는 화술로 어필하고 있는 회사들도 다수 보인다. 또한 대부분 인프라가 잘 갖추어지고(많은 Client, Miner, Exchange, Full Blockchain Node) 성숙한 오픈소스 기반의 기술들이 많은 비트코인 네트워크를 사용한 Public Blockchain 으로 Transaction 을 발생 시키고 Overlay 하는 정도의 기술을 갖고있다.

 작년 중반 까지도 블럭체인 기술을 하는 대부분의 스타트업들은 비트코인과 같은 "가치화폐 창조" 라는 꿈을 갖고 시장에 뛰어들고있었다. 비트코인 네트워크에 Colored Coin 형태의 신규 토큰을 발행하거나 Alt Coin 을 만들어내고, 이 Coin 이 시장에서 가치를 인정받는 순간 "최초 발행한 발행량 x 가치평가금액" 이 그 즉시 실제 돈이 될 수 있는 "일확천금"의 기회가 생기기 때문이다. 그래서 대부분 "Coin Exchange" + "Colored Coin"/"Alt Coin" 기술에 주력을 하고 있었고 사실 지금도 상황은 마찬가지이다.

 그러나 작년 말 부터 금융권을 중심으로하여 불어오는 Consorthium Blockchain, Private Blockchain 의 필요성은, 이해와 응용 비즈니스 모델을 만들어내기 힘든 블럭체인 기술에 대해 그나마 약간 알고 있는 스타트업을 만나고 있으며, 스타트업 기업들은 이 기회를 활용하여 향후 자신들의 이상을 실현하기 위한 스폰서를 찾기 위해 많은 구애활동을 하고 있다.

 불과 지난 1월 20일, 42개 은행의 컨소시엄 회사인 R3CEV 가 Customize 한 Ethereum 으로 11개 은행을 대상으로 PoC 를 수행했다는 기사가 나왔다. IBM 은 2014년, ADEPT 컨셉을 발표할 때에도 Blockchain 기술 기반은 Ethereum 으로 못박고, Resource Sharing 은 Bit Torrent, Messaging 은 Telehash 를 조합하겠다고 발표한 바 있다. R3CEV 의 실제적인 기술진의 핵심은 IBM 의 이전 executive Architect 였던 Richard Gendal Brown 이고, Ethereum 으로 테스트해본것은 어찌보면 당연한듯 해보인다.

 블로그를 통해 Ethereum 을 기반으로 다양한 사상과 원리, 응용방법을 공유하고 그 외 Private / Consorthium Blockchain OSS 구현체들에 대해서도 이야기 해보도록 하겠다.



반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,
안드로이드의 GUI 는 View 와 ViewGroup 의 계층으로 구성된다. View 는 Button 이나 Text Field 와 같은 UI Widget 들이다. (Windows 의 UI Component 들과 같은 개념이다). View Group 은 보이지 않는 컨테이너로, Child View 들이 어떻게 배치(Lay Out) 되는지 (Grid 나 Vertical List 같이)를 정의한다.

안드로이드는 View 와 ViewGroup 의 Subclass 들을 XML 의 Vocabulary 로 제공한다. 이 XML 로 UI 요소들의 계층을 쉽게 정의할 수 있다.

Layout 은 ViewGroup 의 Subclass 들이다. 대표적으로 LinearLayout 과 같은 Subclass 가 있다.

위 그림은 View 와 View Group 의 계층적인 관계도를 도식화 한 것이다.


Linear Layout  생성

res/layout 디렉토리에서 content_hello.xml 을 연다. 기본적으로 RelativeLayout과 TextView Child View 를 사용하도록 되어있다. 현재 코드를 수정해서 Linear Layout 과 EditText View 를 사용하도록 하겠다.

현재 안드로이드가 지원하는 Layout 에 대해서는 ViewGroup 클래스의 Child Class 들을 보면 알 수 있다.

  1. XML 에서 <TextView> 요소를 삭제한다
  2. <RelativeLayout> 요소를 <LinearLayout> 요소로 변경한다
  3. Layout 요소의 android:orientation 속성을 추가하고 "horizontal" 로 값을 준다
  4. Layout 요소의 android:padding 과 tools:context 속성들을 모두 삭제한다

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:showIn="@layout/activity_hello">

위와 같은 코드로 Layout 정의가 변경되어야 한다.

LinearLayout 은 View Group 이며 (ViewGroup의 Subclass), View 들을 android:orientation 속성값에 따라 Vertical 이나 Horizontal 하게 레이아웃 할 수 있다. Linear Layout 의 Child 요소들은 XML 에 정의된 순서대로 표시된다.

android:layout_width, android:layout_height 는 ViewGroup 의 Nest 클래스인 LayoutParams 클래스의 XML 속성으로, 모든 View 들은 이 속성을 사용하여 Size 를 지정하여야 한다.

LinearLayout 이 Layout 의 Root View 이므로, 앱 이 가능한 전체 스크린 사이즈로 크기를 지정한다 ("match_parent" 를 쓰면, 부모 뷰의 크기와 동일한 크기의 width 와 hegith 를 지정하게 된다).


Text Field 추가

모든 View 가 그렇듯, EditText 객체에도 특정 XML 속성을 추가해주어야 한다.

  1. content_hello.xml 에서 <LinearLayout> 요소의 하위 요소로 <EditText>요소를 추가한다.
  2. <EditText> 요소의 속성에 id 를 추가하고, 값을 @+id/edit_message 로 입력한다
  3. layout_width 와 layout_height 는 wrap_content 로 정의한다.
  4. hint 속성으로 edit_message 라는 String 객체를 값으로 넣어준다 (@string/edit_message)

<EditText android:id="@+id/edit_message"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:hint="@string/edit_message" />

그러면 위와 같은 코드가 될것이다.

각 속성에 대한 설명을 하면, 

  • android:id
    View 에 대한 유일한 식별자를 부여하는 것이다. 이 ID 를 통해 View 객체로부터 값을 읽거나 객체를 조작할 수 있다.
    @ 는 XML 에서 모든 리소스 객체를 참조할 때 사용하는 식별자이다.
    android:id="@<리소스타입>/<리소스이름>" 의 형태로 사용한다.
    + 는 리소스 ID 를 처음으로 정의할 때에만 사용한다. 앱을 컴파일할 때 SDK 툴은 프로젝트의 gen/R.java 파일에 EditText 를 참조하는 새로운 리소스 ID 를 만들 때 이 식별자를 사용한다.
    그러나, 리소스 ID 가 생성된 이후 부터는 + 기호를 붙이지 않는다. 또한 String 이나 layout 같은 실체가 있는 리소스에는 사용하지 않는다.

  • android:layout_width, android:layout_height
    특정 사이즈를 입력하는 대신에 "wrap_content"를 사용하면 View 의 Content 크기에 맞게 View 크기가 결정된다. 만약 "match_parent"를 썼다면 View 는 전체 스크린 사이즈로 생성될 것이다. 왜냐하면, EditText의 부모 View 가 LinearLayout 이고 이 Size 는 앱의 전체 화면크기가 되기 때문이다.

  • android:hint
    Text Field 에 값이 없을 때 기본으로 표시되는 값이다. 값을 하드코딩 하는 대신에 "@string/edit_message"와 같이 해주면, 값은 String 리소스가 정의된 분리된 파일을 참조한다.

    hint 의 리소스 객체 이름이 위의 ID 요소와 같다(edit_message). 그러나 리소스 타입이 다르므로 충돌이 발생하지 않는다.


리소스 객체

리소스 객체(Resource Object)는 앱 리소스와 연관된 비트맵, Layout 파일, String 등의 유일한 Integer 이름이다.
모든 리소스는 gens/R.java 내에 상응하는 리소스 객체가 정의된다. R 클래스 내의 객체 이름을 사용하여 android:hint 와 같은 리소스를 참조할 수 있다.
또한 View 와 연계되는 임의의 리소스 ID 를 android:id 를 통해 생성할 수 있다. 
SDK Tool 은 매 컴파일 마다 R.java 파일을 생성한다. 이 파일을 수동으로 편집하지 말아야 한다. 


String Resource 추가

기본적으로 프로젝트에는 res/values/strings.xml 파일이 추가되어있다. 여기에 "edit_message" 라는 리소스 이름의 새로운 String 객체를 만들고, 값을 "메시지 입력" 이라고 설정할 것이다.

<resources>
    <string name="app_name">Hello Android</string>
    <string name="edit_message">메시지 입력</string>
    <string name="button_send">보내기</string>
    <string name="action_settings">설정</string>
</resources>

위와 같이 res/values/strings.xml 파일을 편집한다. 이후에 할 작업들이 더 있는데, 여기에서 사용할 추가적인 String 리소스 객체들도 넣어주었다.

Button 추가

메시지 Send 버튼을 하나 추가해본다. 아래와 같이 context XML 에 Edit Text 다음에 Button 요소를 하나 추가한다.
<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/button_send" />

버튼 Size 는 wrap_content 로 버튼 내부의 컨텐츠 사이즈에 자동으로 버튼 크기를 맞추도록 했다.

Preview 에서 보이는 화면의 일부이다. 


그런데 영 모양이 좋지가 않다. 메시지 입력하는 부분이 wrap_content 사이즈를 갖기때문인데, 다음 과정에서 좀더 보기좋게 모양을 변경해 보도록 한다.

화면 넓이 만큼 Input Box 채우기

Android 의 View 들은 layout_weight 라는 개념이 있다.
특정 수치에 의한 고정값을 사이즈로 주는것이 아니라 한줄에 들어갈 View 간에 사이즈 비율을 주는 것이다. 예를 들어 EditText 의 Weight 가 2 이고 Button 이 1 이면 2:1 의 화면 비율로 채우란 이야기이다.
기본값은 0 으로, weight 의 비율이 설정되지 않는다.

만약 여기에, EditText 를 weight 1 로 주고, Button 의 width 가 wrap_content 라면, Button 의 wrap_content 에 의해 계산된 사이즈를 뺀 나머지 크기를 EditText 가 모두 채우게 된다.
<EditText android:id="@+id/edit_message"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:hint="@string/edit_message"
    android:layout_weight="1"/>

위와 같이 코드를 작성하되, EditText 의 layout_width 가 기존의 wrap_content 에서 0dp 로 변경된것을 유의해서 보아야 한다. EditText 의 weight 를 주었으므로 궂이 layout_width 를 wrap_content 로 하여 컨텐츠 영역의 넓이를 계싼하게 할 필요가 없다. 이는 성능상의 이유로 0dp 를 주어 계산을 건너뛰게 한것이다.


Preview 에서 위와 같이 보이게 되고,


실제 디바이스에서는 위와 같이 표시된다. (갤럭시 노트 4 / 안드로이드 5.1.1 Lollipop MR1 / API Level 22)


반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,
안드로이드 프로젝트가 생성 되었으니, 이번에는 바로 실행으로 들어가본다. 일단 환경 설정이 잘 되었는지 확인도 할 겸~

디바이스 설정

USB 디버깅 옵션을 켜놓아야 함
 - Android 3.2 이전 버전은 주로 Settings>Applications>Development 
 - Android 4.0 이상은 Settings>Developer options 로 있음
   4.2 이상의 디바이스 에서는 Developer Option 이 숨겨져 있는 경우가 많은데, Settings>About Phone 안에서 Build Number 을 7번 탭하면 Developer Option 이 나타난다.

PC 에 연결하기 위해 Vendor 에서 제공되는 드라이버를 설치해야 하는 경우도 있다.

Android Studio 에서 실행

Run 버튼 

 을 눌러서 실행시키거나 Shift+F10 으로 실행하면 Run 이 실행되고, Debug Run 하고 싶다면 Run 옆의 Debug 버튼(Shift+F9)을 누른다.


Command Line 에서 실행

Project 루트 디렉토리 안에 gradlew.bat 파일을 이용하여 Gradle 을 통해 빌드할 수 있다.

디버그 모드로 빌드하려면
> gradlew.bat assembleDebug

릴리즈 모드로 빌드하려면
> gradlew.bat assembleRelease

빌드 된 .apk 파일은 <프로젝트루트>/app/build/outputs/apk 안에 위치한다.

디바이스에 설치하려면
> adb install app/build/outputs/apk/app-debug.apk

와 같이 한다. 단, 이때 adb 는 <Android SDK>/platform-tools 디렉토리가 PATH 에 잡혀있어야 한다


Emulator 로 실행

아래 이미지 캡춰만으로도 이해가 충분히 갈테니 긴 설명은 하지 않겠다.







그런데 이렇게 만들어놓은 AVD 가 실행을 해보면...


뭐 이런경우가 있나 하고 찾아보니, x86 CPU/ABI 가 AVD 만들 때 기본 선택되었고, 이때는 Intel HAXM 을 별도로 설치 해주어야 한단다.


이렇게 Extras 에서 추가요소를 선택하여 설치하고나면,


SDK\extras\intel\Hardware_Accelerated_Execution_Manager\intelhaxm-adnroid.exe 파일이 있다. 이걸 실행시켜서 설치하면..

위처럼, 내 컴퓨터는 AMD CPU 이고, VT-x 를 지원하지 않는다. 이럴때는 별 수 없다. 그냥 AVD 만들 때 ARM 기반의 Device 를 만들어서 쓰는 수밖에 없다. Hardware Acceleration 을 쓸 수 없고, 그나마 AMD 는 Linux 에서만 이 기능이 지원된단다.

Hardware Acceleration 을 쓸 수 있는 Intel Machine 이라면 여기를 참조한다.

다른 방법은 Genymotion 과 같은 별도의 Emulator 를 다운로드 받는 방법이 있다.
(조만간 내 구닥다리 AMD 에서 Hardware Acceleration 이 가능해지면 내용을 추가하겠다)


반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,
이번에는 이전에 생성한 프로젝트 내부의 구조에 대해 살펴보도록 한다.

Project 를 만들고 나면, 좌측의 Project View 를 통해서 res/layout 디렉토리에 생긴 메인 Activity (New Project 에서 생성한)를 열어본다.

위와 같은 구조의 프로젝트 내 파일들이 보이게 된다.


Activity Layout

Activity 의 Layout 을 정의하는 XML 이며, Design 과 Text (코드)를 볼 수 있는 Tab 이 모두 존재한다.


이 Activity Layout XML 에는 앱 상단의 앱바와 Floating Action Button 같은 (향후에 더욱 자세히 보도록 하고) 컴포넌트의 속성이 XML 의 Element 와 Attribute 로 설정되어있다

위 처럼 기본적인 Blank Activity 를 생성하면 Action Bar, Content, Floating Action Button 이 생성된다.

Activity 의 전체적인 Layout 은 activity XML 에 정의가 되고, TextView 로 구성된 Content 영역은 content XML 에 정의되어있다. 

Activity XML 의 중간 쯤에 보면

<include layout="@layout/content_hello" />

이 들어가 있고, 이렇게 content_hello 라는 Layout 요소를 추가적으로 포함(include) 하도록 되어있다. 그리고, content_hello.xml 파일을 보면

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
</RelativeLayout>

위 처럼 TextView Element 로 추가적인 Layout 이 구성됨을 볼 수 있다. 텍스트 내용으로 "Hello World!" 라는 텍스트도 보인다.


Main Activity.java

app\src\main\java\com\goodjoon\helloandroid\HelloActivity.java 파일을 열어본다. 
현재 Main Activity 는 HelloActivity 로 등록되어 있으며. Activity XML 리소스 파일이 이 java 파일에 연결되어 있음을 확인할 수 있다.

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_hello); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

앱을 실행시키면 이 Activity 클래스가 실행되고 Main Activity XML 리소스가 로드되어 Hello World! 가 출력되는 메인 Activity 가 나옴을 확인할 수 있다.


앱 Manifest

app\src\main\AndroidManifest.xml 파일은 앱의 기초적인 특성과 각 컴포넌트를 정의하는 파일이다. 컴포넌트를 추가하면 이 파일이 지속적으로 변경되게 된다.


Gradle 빌드파일

app\build.gradle 파일은 Project View 에서는 "Gradle Scripts" 라는 별개의 그룹으로 표시되는데, 실제 위치는 app\ 디렉토리 밑에 존재한다.

Android Studio 는 앱을 컴파일 하고 빌드하는데에 Gradle 을 사용한다. 

프로젝트의 각 모듈 별로 build.gradle 파일이 존재하며 프로젝트 전체에 또 하나의 build.gradle 파일도 존재한다. 보통 각 모듈 내의 build.gradle 파일이 주요 관심 대상이 된다. 지금 모듈은 app 모듈이다.


위의 build.gradle 은 프로젝트 전체에 대한 build.gradle 스크립트 (프로젝트디렉토리\build.gradle)이고, app 모듈에 대해 build.gradle 파일(프로젝트디렉토리\app\build.gradle)이 추가적으로 존재한다.

Module build.gradle 파일 안에 보면 defaultConfig 을 포함한 몇가지 설정이 있다


apply plugin'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.goodjoon.helloandroid"
        minSdkVersion 17
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir'libs'include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
}

  • compileSdkVersion 
    앱을 Compile 하기 위해 사용하는 Platform SDK 의 버전을 명시한다. 기본적으로 설치되어있는 SDK 버전 중 가장 최신의 SDK 를 사용하도록 설정되어있다. 위 설정에서는 API Level 23 (=SDK Version 23 = Android 6.0 = 마쉬멜로우) SDK 를 사용하도록 되어있으므로, 만약 SDK 가 설치되어있지 않다면, SDK Manager로 SDK 를 설치해야 한다.
    SDK 버전이 높다고 해서 구버전 앱을 빌드할 수 없는게 아니며(하위호환성 유지) 오히려 낮은 버전의 SDK 로 빌드하게 되면 더 높은 버전의 Platform 에서는 새로운 기능을 사용할 수 없거나 더 좋은 UX 를 사용할 수 없게된다.
  • applicationId
    New Project Window 에서 지정했던 Package 이름으로, App 의 유일한 식별자이다.
  • minSdkVersion
    현재 앱이 지원하는 가장 낮은 SDK 버전을 지정
  • targetSdkVersion
    현재 앱이 지원하는 가장 높은 SDK 버전. 자신이 테스트해본 가장 높은 버전을 명시하면 된다


기타 리소스

  • drawable-<density>/ 리소스 디렉토리 <ldpi(0.75), mdpi(1.0), hdpi(1.5), xhdpi(2.0)>
    이 디렉토리에는 밀도 독립 픽셀(DIP: Density Independent Pixel)별 drawable 이미지나 아이콘 같은 "그려지는" 리소스가 위치한다. DIP 에 대해서는 나중에 더 설명하도록 하자. 일단, Android 는 다양한 해상도를 갖는 기기가 많으므로, pixel (px) 단위가 아닌 dp 나 sp 단위로 크기를 지정해야 한다.
    참조는 @drawable/image.png 와 같이 사용한다.

  • layout/
    activity XML 과 같이 앱의 UI 를 정의하는 파일들이 위치한다. 

  • menu/
    앱의 메뉴 아이템을 정의하는 파일들이 위치

  • mipmap/
    Launcher 아이콘(앱아이콘)으로, drawable/ 폴더 대신 이 폴더를 사용한다. ic_launcher.png 아이콘 이미지들이 해상도별로 들어있다.

  • values/
    String 이나 Color 정의와 같은 리소스 컬렉션을 포함하는 XML 파일들이 위치하는 디렉토리 이다.




반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,


 4년 간 Hybrid Mobile App 개발도구를 포함한 MEAP 솔루션 개발을 리딩해왔지만 모바일쪽 개발은 주로 iOS 만을 해왔다. 안드로이도 개발은 직접 하지 않았는데, 올해 사적인 프로젝트를 하나 진행하기 위해 안드로이드쪽 앱을 직접 개발하지 않으면 안되는 상황이다.

 작년 초반 까지만 해도 Eclipse에 Android Development Tools 플러그인을 설치하고, XCode 의 Command Line Build 를 함께 쓰도록 하여 Hybrid App 개발툴킷을 만들었지만 작년 중반 이후에 Google에서 Android Studio 만을 사용하도록 강력히 밀고있는 상황이라 난 Android Studio 를 사용하기로 결정했다.

 일단, Android Studio 를 다운로드 받는다


■ 신규 프로젝트 생성

Android Studio를 설치 후 실행하면, 아래 처럼 New Project Window 가 실행된다

처음 프로젝트를 시작하므로, "Start a new Android Studio Project" 를 선택


New Project 화면에서의 요소별 설명은 다음과 같다

  • Application Name - 사용자에게 보여질 앱 이름이다
  • Company Domain - 실제 Domain 일 필요는 없고, App 을 구별하기 위한 Package ID 의 base 값 정도로 생각하면 된다. goodjoon.com 을 넣으면 자동으로 Package Name 이 com.goojoon.<소문자 기반으로한 앱 이름>
  • Package Name - Application Name 과 Company Domain 을 조합하여 만든 Package 이름이다. 이게 Android App 을 식별하는 유일한 이름이 된다

※ 한글 앱 이름

앱 이름이 한글이면, Package Name 이 자동생성 되지 않는다 이때는 Package Name 우측에 보이는 "edit" 를 클릭하여 수동으로 패키지 이름을 변경해주면 된다.

또한 가급적이면 Project location 에 한글명이 들어가는 경로는 피하도록 하자.


이제 Target Android Device 를 선택한다. Minimum SDK 목록을 보면 이제 친절하게도 API Level 과 함께 OS 이름도 나온다. 이 SDK 를 잘 설정해주어야 나중에 어떤 버전 기기에서는 보이네 안보이네 하는 문제에서 자유로울 수 있다.


더 놀라운것은, SDK 를 선택하면, 세계적으로 해당 SDK 버전 이상의 OS 사용자 비율을 보여준다는 것이다. 위 화면에서는 4.2 젤리빈으로 개발하면 전세계 약 81.4% 의 Android 기기에 설치될 수 있는 앱을 개발할 수 있음을 보여준다


이제 이렇게 SDK 까지 선택한 후, 처음 실행 될 Activity 를 선택하는 화면이 나온다. 다음 편에서는 Android 의 Activity 가 무엇인가 부터 찬찬히 살펴보도록 하겠다





반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,