반응형

Gradle

설치

  • 설치 파일 압축을 풀고 설치 경로를 GRADLE_HOME 환경변수로 설정
  • GRADLE_OPTS에 Gradle 전용 JVM 옵션 설정
  • GRADLE_USER_HOME : 없으면 $HOME/.gradle. 여기에 의존 *.jar 파일등이 저장된다.
  • JAVA_OPTS에 자바 애플리케이션 공용 JVM 옵션 설정
  • *.build 파일의 인코딩
    • 기본적으로 Java의 file.encoding 시스템 프라퍼티를 따른다.
    • 윈도우 환경에서 UTF-8로 빌드 파일을 만들려면 GRADLE_OPTS=-Dfile.encoding=UTF-8 형태로 강제 지정
export GRADLE_OPTS="-Dfile.encoding=UTF-8 -Xmx512m -XX:PermSize=64m -XX:MaxPermSize=256m"

실행속도 높이기

  • ${HOME}/.gradle/gradle.properties
    org.gradle.daemon=true
  • 이제부터 Gradle이 데몬으로 떠서 실행되기 때문에 초기 로딩 시간이 줄어든다.
  • 3시간동안 Gradle 작업이 없으면 데몬이 자동 종료된다.

스크립트에서 사용할 인증 정보 분리해두기

build setup

  • 프로젝트를 시작할 때 gradle init를 실행하면 현재 디렉토리에 Gradle 관련 기본 파일들을 생성해준다.(구버전은 setupBuild)
  • Maven 프로젝트 디렉토리에서 실행하면 자동 컨버팅을 실행한다.
  • 실행시 프로젝트 구조를 Java library로 지정하기(1.7 이후)
    gradle init --type java-library
     
    # --type 을 생략하면 basic 으로 지정된다.
  • Project Types
    • pom
    • basic
    • java-library
    • groovy-library
    • scala-library
  • Project 디렉토리 구조 생성 task
    // 적용된 프로그래밍 언어 플러그인에 따라 소스 트리 구조 자동 생성
    task initSrc << {
        project.sourceSets*.allSource.srcDirTrees.flatten().dir.each { dir ->
            dir.mkdirs()
        }
    }

명령 실행과 옵션

  • 기본적으로 gradle을 통해 실행되는 단위를 “Task 태스크”라고 한다.(Ant의 target, Maven의 phase와 유사한 개념)
  • 태스크는 의존 관계에 따라 단 한 번만 실행된다.
  • -q : quiet. 로그 안 찍음. Gradle Logging
  • -x 태스크 : 해당 테스크는 실행하지 않음.
  • --continue : 빌드 실패시 즉시 종료하지 않고, 독립적인 태스크들은 모두 수행하고 종료한다.
  • -d|--debug : Debug 정보 및 stacktrace 출력
  • 태스크 축약
    • dist → di 형태로 최소한 알아볼 수 있는 만큼만 적어도 됨
    • 낙타 표기 compileTest → cT
  • -b 빌드파일 : build.gradle 이 아닌 다른 빌드 파일을 선택해 실행한다. 이 경우 settings.gradle 은 무시된다.
  • -p 프로젝트명 : 멀티 프로젝트에서 어떤 서브 프로젝트를 선택해서 실행 할 경우. -b 대신 -p를 사용할 것.
  • -P프라퍼티이름=값 : 프라퍼티 지정. 값 없이 프라퍼티만 지정해도 된다.
    • 이 값은 빌드 스크립트에서 프라퍼티이름으로 바로 접근 가능하다.
    • 프라퍼티 이름에 “my.property” 형태로 돼 있다면 project.get('my.property') 형태로 접근 가능하다.
  • --gui : GUI 환경에서 태스크를 실행하고 관리한다.
  • --recompile-scripts : build.gradle들 다시 컴파일한다.
  • 환경변수 TERM=dumb으로 하면 Gradle의 진행 상황 로그가 안나오게 된다.
  • Task 상세 도움말은 help --task [태스크이름] 으로 볼 수 있다.
    gradle help --task wrapper  

빌드 정보 확인

  • projects : 프로젝트 목록
  • tasks : 태스크 목록
    • 기본적으로 태스크 그룹에 속한 것만 보여준다.
      dist {
          description = '태스크 설명'
          group = '태스크의 그룹'
      }
      // 혹은
      dist.description = '태스크 설명'
      dist.group = '태스크의 그룹'
    • --all : 태스크 그룹에 상관없이 다 보여줌
  • [자식프로젝트명:]dependencies : Root 혹은 지정 프로젝트의 의존성 트리를 보여준다.
    • –configuration runtime : runtime 의존성만 보여준다.
  • [자식프로젝트명:]properties : Root 혹은 지정 프로젝트의 속성 값들을 모두 보여준다.
  • --profile : 빌드 수행을 프로파일링하여 성능 정보를 ./build/reports/profile 디렉토리에 저장한다.
  • -m 태스크들 : 태스크를 실제 수행은 하지 않고, 해당 태스크와 함께 실행되는 모든 태스크 목록을 순서대로 보여준다.

태스크 튜토리얼

  • 의존성 : task name(depdendsOn: 다른태스크 | [task1, task2, …]) … 형태로 만든다.
  • task “태스크이름” … : 태스크 이름이 문자열 GString이 될 수 있기 때문에 동적으로 태스크를 생성하는 것이 가능하다.
  • 태스트의 시작과 끝 액션
    task hello << {
        println 'Hello Earth'
    }
    hello.doFirst {
        println 'Hello Venus'
    }
    hello.doLast {
        println 'Hello Mars'
    }
    hello << {
        println 'Hello Jupiter'
    }
    • < <는 doLast와 같은 의미이다. doFirst/doLast는 여러개 선언될 수 있으며 doFirst가 선언된 순서로 먼저 실행되고, 그 뒤에 doLast가 선언된 순서대로 실행된다.
  • Task Properties : 태스크 안에서 ext.프라퍼티명 = 값 형태로 선언하면 다른 위치에서 태스크명.프라퍼티명 으로 해당 값을 읽을 수 있다.
  • 기본 태스크
    defaultTasks 'clean', 'run'
     
    task clean << {
    ...
    }
    task run << {
    ...
    }
    • 멀티 프로젝트에서 각 하위 프로젝트는 자신만의 기본 태스크를 선언할 수 있다. 기본 태스크가 없으면 부모의 기본 태스크를 수행한다.
  • 수행할 태스크에 따라 조건 주기
    gradle.taskGraph.whenReady { taskGraph ->
        if (taskGraph.hasTask(release)) {
            // release 라는 태스크를 수행할 예정일때 미리 실행할 코드
        } else {
            // release 라는 태스크를 수행할 예정이 아닐 때 미리 실행할 코드
        }
    }

Java 개발하기

다음 java 개발 관련 항목들을 읽어본다.

DSL

  • Groovy 빌드 파일은 기본적으로 Project 클래스의 인스턴스이다.
  • 빌드 파일에 등장하는 변수나 메소드 중에서 미리 선언된 것이 아니라면 Project 클래스에서 해당 속성을 찾는다.
  • Project 객체는 project로도 접근 가능하다.

Project 객체의 기본 프라퍼티들

  • project Project : 자기 자신의 인스턴스
  • name String : 프로젝트 디렉토리명
  • path String : 프로젝트의 Fully Qualified Name
  • description String : 프로젝트 설명
  • projectDir File : 빌드 스크립트가 있는 프로젝트 디렉토리
  • buildDir File : projectDir/build 이 값을 바꾸면 빌드 디렉토리를 바꿀 수 있게 되는 것이다.
  • group Object : unspecified - 직접 지정
  • version Object : unspecified - 직접 지정
  • ant AntBuilder : AntBuilder 인스턴스

변수 선언

  • 로컬 변수 : def 변수명으로 선언. 해당 스크립트 로컬에서만 접근 가능하다.
  • ext 변수 : 프로젝트 전체와 서브 프로젝트에서도 접근 가능하다.
  • ext 변수 선언과 사용
    ext.javaVersion = '1.7' // 한개씩 선언
    ext {
        // 여러개 한꺼번에 선언
        springVersion = '3.1.0.RELEASE'
        emailNotification = 'build@master.org'
    }
     
    // 가변 Key, 가변 값 형태로 코드를 통해 프라퍼티를 추가할 때는 아래 방식을 사용한다.
    project.ext['keyname'] = 'value'
     
    task hello << {
        println "javaVersion : ${javaVersion}"
        println "springVersion : ${springVersion}"
        println "emailNotification : ${emailNotification}"
    }

스크립트 컴파일

  • 모든 빌드 스크립트는 컴파일하여 .gradle 에 저장하고 캐시된다.
  • 빌드 파일이 변경되면 그 때 재컴파일 한다.
  • --recompile-scripts 옵션을 주면 강제 재컴파일 한다.

이것 저것

디렉토리 생성

  • 여러 태스크에서 특정 디렉토리를 필요로 할 경우에는, 디렉토리 생성 태스크를 만들고 다른 태스크가 그 태스크에 의존하도록 만든다.
classesDir = new File('build/classes')
task resources << {
    classesDir.mkdirs()
    // do something
}
task compile(dependsOn: 'resources') << {
    if (classesDir.isDirectory()) {
        println '필요한 디렉토리가 존재하네요.'
    }
    // do something
}

Gradle 프라퍼티와 시스템 프라퍼티

  • -D프라퍼티명=값으로 시스템 프라퍼티를 추가할 수 있다.
  • gradle.properties를 통해 프라퍼티를 추가할 수 있다.
    • $USER_HOME/.gradle/gradle.properties 혹은
    • 프로젝트홈/gradle.properties
    • $USER_HOME에 있는 것이 우선한다.
    • 여기 지정된 값을 project 객체를 통해 접근할 수 있다.
  • -P프라퍼티명=값으로 project 객체에 프라퍼티를 추가한다.
  • 환경변수 ORG_GRADLE_PROJECT_프라퍼티이름=값으로 project 객체에 프라퍼티를 추가한다.
  • 시스템 프라퍼티 org.gradle.project.프라퍼티이름=값으로 project 객체에 프라퍼티를 추가한다.
  • gradle.properties의 프라퍼티 중에 systemProp.으로 시작하는 프라퍼티는 시스템 프라퍼티로 변환된다.
    • gradle.properties
      gradlePropertiesProp=gradlePropertiesValue
      systemPropertiesProp=shouldBeOverWrittenBySystemProp
      envPropertiesProp=shouldBeOverWrittenByEnvProp
      systemProp.system=systemValue
    • build.gradle
      task printProps << {
          println commandLineProjectProp
          println gradlePropertiesProp
          println systemProjectProp
          println envProjectProp
          println System.properties['system']
      }
    • 실행하면
      > gradle -q -PcommandLineProjectProp=commandLineProjectPropValue -Dorg.gradle.project.systemProjectProp=systemPropertyValue printProps
      commandLineProjectPropValue
      gradlePropertiesValue
      systemPropertyValue
      envPropertyValue
      systemValue

프로젝트 프라퍼티 검사

  • 프로젝트 프라퍼티는 빌드 스크립트에서 프라퍼티 이름으로 바로 접근 가능하다. 하지만 프라퍼티가 존재하지 않으면 예외가 발생한다.
  • hasProperty('propertyName')으로 프라퍼티의 존재 여부를 검사할 수 있다.

외부 빌드 스크립트로 프로젝트 구성하기

외부 *.gradle 빌드 스크립트를 만들어서 불러올 수 있다.

  • build.gradle에서 other.gradle을 불러온다.
    apply from: 'other.gradle'
  • other.gradle
    println "configuring $project"
    task hello << {
        println 'hello from other script'
    }
  • 실행하면
    > gradle -q hello
    configuring root project 'configureProjectUsingScript'
    hello from other script

임의의 객체 구성하기

configure 메소드로 임의의 객체를 구성할 수 있다.

  • build.gradle
    task configure << {
        pos = configure(new java.text.FieldPosition(10)) {
            beginIndex = 1
            endIndex = 5
        }
        println pos.beginIndex
        println pos.endIndex
    }
  • 실행하면
    > gradle -q configure
    1
    5

외부 스크립트로 임의의 객체 구성하기

  • build.gradle
    task configure << {
        pos = new java.text.FieldPosition(10)
        // 외부 스크립트 적용
        apply from: 'other.gradle', to: pos
        println pos.beginIndex
        println pos.endIndex
    }
  • other.gradle
    beginIndex = 1;
    endIndex = 5;
  • 실행하면
    > gradle -q configure
    1
    5

캐싱 cache

Gradle은 컴파일한 스크립트를 캐싱한다. 프로젝트에서 처음으로 빌드를 실행하면 .gradle 디렉토리가 만들어지고 거기에 컴파일된 스크립트가 들어간다. 다음에 다시 빌드를 실행하면 스크립트에 변경이 없다면 컴파일 해뒀던 것을 실행한다. 그렇지 않으면 재 컴파일을 하고 캐시에 새로운 버전이 들어간다. --recompile-scripts 옵션으로 실행하면 캐시를 삭제하고 모두 다시 컴파일해서 캐시에 새로 저장한다.

자세히 살펴보기

Plugins

읽을꺼리

반응형
LIST
반응형

20. 쓰레드(Thread)와 핸들러(Handler)

ExampleThreadHandler-Memoryleaks.zip

ExampleThreadHandler.zip


20-1 쓰레드와 핸들러란?

네이버 지식백과에서는 아래와 같이 정의하고 있습니다


컴퓨터 프로그램 수행 시 프로세스 내부에 존재하는 수행 경로, 즉 일련의 실행 코드. 프로세스는 단순한 껍데기일 뿐, 실제 작업은 스레드가 담당한다. 프로세스 생성 시 하나의 주 스레드가 생성되어 대부분의 작업을 처리하고 주 스레드가 종료되면 프로세스도 종료된다. 하나의 운영 체계에서 여러 개의 프로세스가 동시에 실행되는 환경이 멀티태스킹이고, 하나의 프로세스 내에서 다수의 스레드가 동시에 수행되는 것이 멀티스레딩이다.


위 말을 풀어서 제 나름대로 해석하면 아래와 같습니다


프로그램을 실행할때, 프로그램안에 존재하는 실행 코드들이다


그런데 우리는 쓰레드를 처음 접하는것이 아닙니다

전에 프로그래스바 예제등을 통해 한두번 접해보았습니다


그리고 우리는 쓰레드를 처음 사용하는것도 아닙니다

왜냐? 어플을 실행하면 처음에 메인 쓰레드라는것이 생기기 때문입니다

이 메인 쓰레드는 안드로이드에서 우리가 함부로 접근이 불가능 하게 막아뒀습니다


또한 메인 쓰레드에서만 UI를 변경할수 있습니다

안정성을 위함이라 하는데... 아무튼 쓰레드에 대한 기본 지식은 여기까지 알아두셔도 됩니다



쓰레드는 반복작업같은 것을 주로 하는데요

위에서 메인 쓰레드만 UI변경이 가능하다고 했습니다

우리가 만든 쓰레드에서는 UI변경이 불가능, 즉 화면을 바꾸는 어떠한 일도 할수 없습니다2


그래서 등장한것이 핸들러 입니다


이런 관계를 가진다고나 할까요?


이번 예제에서는 이 쓰레드와 핸들러 사용법에 관해 아주 기초적인 지식만 알고 넘어가도록 하겠습니다


(더 자세한 지식은 저도 더 배워야 하고 좀 지난뒤에 심화로 나가면 되죠 ㅎ)


20-2 이번에 만들 예제는 어떤 예제 인가요?

저는 이 강좌를 구상할때 카운트 다운을 한번 해볼까 했습니다

그래서 이번에는 숫자를 입력하고, 버튼을 누르면 위에있는 TextView에 카운트 다운이 되도록 해볼까3 합니다

이 강좌를 잘 보면 당신도 멀쩡한 카운트 다운 어플을 만들어 배포할수 있을겁니다 ^^



20-3 레이아웃은 어떻게 구성할까요?

저만 그런진 몰라도 저는 일단 어떻게 어플을 만들까 라는 아이디어가 생각나면 직관적으로 레이아웃이 떠오르더라고요 +_+

레이아웃은 아무렇게나 짜도 되지만 꼭 EditText, Button, TextView로 짜주시고, TextView의 글자를 없애주세요

(사실 매번 강좌쓸때마다 예제를 어떻게 만들까를 강좌 쓰면서 생각하지요 -_-)


<EditText

    android:id="@+id/EditText"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:layout_alignParentTop="true"

    android:layout_centerHorizontal="true"

    android:inputType="number" >


    <requestFocus />

</EditText>


<Button

    android:id="@+id/Button"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_below="@+id/EditText"

    android:layout_centerHorizontal="true"

    android:onClick="Button_Click"

    android:text="입력하시고 터치하세요" />


<TextView

    android:id="@+id/Count_TextView"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_below="@+id/Button"

    android:layout_centerHorizontal="true"

    android:layout_marginTop="30dp"

    android:textSize="50dp" />


저는 이렇게 짰습니다 ㅎㅎ



20-4 자바소스로 넘어와 주세요

먼저 맨날 하던거 해봅시다

EditText EditText;

TextView Count_TextView;

Button Button;


int inputNumber;

마지막 int inputNumber은 입력한 숫자를 저장할 변수를 설정하는 것입니다 입력한 값을 저장하기 위한 코드입니다

프로그래머는 변수를 최소한으로 사용해서 메모리 공간을 절약해야 할것입니다

예를 들면 String같은건 엄청나게 많은 메모리를 잡아먹습니다 ㅎ...



프로그래밍 하면서 가장 중요한것은

가장 적게 메모리를 먹고, 가장 빠르게 작동하고, 불필요한 소스가 없는 상태로 만드는것임을 꼭 기억해 주세요!!!

적은 메모리 점유율도 중요하지만 목적에 따라 적합한 방법을 사용해야 합니다

예를들면 int형 변수의 최대 표현 범위를 벗어나는 숫자는 long을 이용한다든지 말이죠 (Thanks for showcan2000)


--참조--

2013/02/20 - [Development/Java] - 자료형을 기반으로 메모리 공간에 저장되는 상수!

2013/02/20 - [Development/Java] - 변수와 자료형이란?!



자 이제 id값을 연결해 봅시다

EditText = (EditText) findViewById(R.id.EditText);

Count_TextView = (TextView) findViewById(R.id.Count_TextView);

Button = (Button) findViewById(R.id.Button);


마지막으로 버튼을 눌렀을때 어떤 작업을 할지 메소드를 만들어 줘야합니다

전에 많이 만든것처럼 이름이 Button_Click인 메소드를 만들어 주세요

(사실 이부분까지 쓰고 혼자서 예제를 만들어 봤는데요 꽤 길더라고요 ㅎㅎ;;)

자잘한 부분으로 쪼개서 봅시다

Part 1

String input = EditText.getText().toString();

Count_TextView.setText(input);

메소드의 처음은 EditText에 입력한 값을 가져오고 TextView에 적용하는 코드를 구현했습니다

이해다들 되시죠???


Part 2

if(input.equals("")){

Toast.makeText(this, "공백입니다", Toast.LENGTH_SHORT).show();

}else{


}

equals를 이용해 만약, 입력한것이 공백("")일경우 토스트 알림을 띄우도록 했습니다

Part 3부터는 저부분의 else{}안에 들어가는 코드들 입니다


Part 3

inputNumber = Integer.parseInt(input);


if(inputNumber==0){

Toast.makeText(this, "0은 입력할수 없습니다", Toast.LENGTH_SHORT).show();

return;

}

Button.setEnabled(false);

공백이 아닐경우(뭐라도 입력한경우) String값을 int로 변환합니다

즉 숫자로 처리할수 있게 합니다

0을 입력할경우에는 진행할수 없도록 return;을 이용해 메소드를 끝냅니다


그아래는 공백도 아니고, 0도 아닐때 버튼을 비활성화 하도록 처리했습니다


Part 4 매우매우 중요 (핵심 내용)

이부분은 매우 중요하지만 일일히 설명하기 어려우므로 상자 안에서 설명하겠습니다

아래에서 위로 훓터봐 주세요

final Handler handler = new Handler(){

@Override

public void handleMessage(Message msg){

if(msg.what4==1){

Log.d("What Number : ", "What is 1");

}else if(msg.what==2){

Log.d("What Number : ", "What is 2");

}

Count_TextView.setText(""+inputNumber);

if(inputNumber==0){

Toast.makeText(MainActivity.this, "카운트가 완료되었습니다", Toast.LENGTH_SHORT).show();

Button.setEnabled(true);

}

}

};5


메모리 릭 발생 오류 수정


이부분은 핸들러를 만드는 부분입니다

아래에 있는 sendEmptyMessage과 sendMessage로 이 핸들러에 메세지를 보낼수 있는데요

저기 보이는 what이라는것은 메세지를 구분할때 쓰입니다

sendEmptyMessage의 경우에는 sendEmptyMessage(int what)으로, ()안에 what의 값을 넣어 핸들러에게 전달하고요

sendMessage같은것은 message를 보냅니다

전달된 message객체에는 what값외 arg1, arg2, obj등을 보낼수 있습니다


what의 값에 따라 어떤 행동을 할것인지 정해주면 됩니다

지금은 예제이므로 로그를 띄워 확인해 보는 작업을 해보았습니다


Runnable task = new Runnable(){

public void run(){

while(inputNumber > 0){

try {

Thread.sleep(1000);

} catch (InterruptedException e) {}


--inputNumber;


handler.sendEmptyMessage(1);


Message message= Message.obtain();

message.what = 2;

handler.sendMessage(message);

}

}

};

이 부분은 Runnable을 정의하는 부분입니다

Runnable에 관해서는 나중에 더 자세히 다룰예정입니다

일단 Thread가 시작되면 저 run()메소드가 실행되게 됩니다

이때 while문으로 입력한 숫자가 0보다 크면 실행되게 만듭니다(0이거나 0보다 작으면 실행이 안됩니다)

Thread.sleep(1000);부분은 try-catch로 묶여 있습니다

예외처리인데요 이것도 나중에 더 배워보도록 합시다


그아래 handler가 중요합니다

위에서 설명한것처럼 sendEmptyMessage()는 int형 숫자를 전달합니다

이는 핸들러에서 msg.what으로 참조가 가능합니다 (위 참조)

sendEmptyMessage()아래에는 Message객체를 이용한 핸들러 메세지 전달법도 설명하고 있습니다


Thread thread = new Thread(task);

thread.start();


위 예제는 메모리 릭을 발생시킬수 있습니다

http://regularmotion.kr/android-how-to-leak-a-context-handlers-inner-classes/

위 방법으로 시도해 주세요 (Thanks for 엘(akthfdyd))

만약 글이 삭제됬을경우



쓰레드를 실행하고 핸들러에게 메세지를 전달하는 과정을 그림으로 표시하면 다음과 같습니다


(이야 제가봐도 잘만든거 같아요 ㅎㅎ(?))


자, 이렇게 모든 코드를 살펴보았고, 직접 짜봤습니다


결론을 말하자면, 값을 입력하고 버튼을 누르면

쓰레드가 실행되고

이때 UI변경작업(setText)을 할수 없으므로 핸들러에게 "야 니가해"라는 메세지를 보냅니다

그 메세지를 받은 핸들러가 setText작업을 정상적으로 하여, 완성되는 것이지요 ㅎㅎ



끝났습니다~~

항상 하는 완성작을 확인해 보겠습니다


    

이렇게 입력한 값이 정상적으로 카운트 다운 되는것을 확인할수 있습니다 ㅎㅎ



우아 이 강좌 쓰는데만 구상하는데 2일, 쓰는데 3시간이 걸린거 같네요 ;;

이번 강좌는 너무 힘들게 작성했습니다 ㅠㅠ

꼭 보신분들 덧글 하나라도 달아주시면 감사드리겠습니다 ㅠㅠ



다음 강좌에 대해서 말씀드리자면..

20번대 강좌에서는 알림(진행중같은거)띄우기, 서비스 사용하기, 부팅시 자동실행, 설정값 저장같은

정말 어플개발에 꼭 필요한 지식을 배울려고 합니다 ㅎㅎ


그리고 문자입력창 옆에 있는 길이 확인란 있죠? 50/140 뭐 이런거..

넘어가면 MMS이고... 이거 한번 구현해 볼까 합니다 ㅎㅎ




이글은 [http://itmir.tistory.com/366] 에서 다시 보실수 있으며 원본 글의 저작권은 미르에게 있습니다


반응형
LIST
반응형

리눅스에서 어떤 프로세스들이 CPU와 메모리를 얼마나 쓰고 있는지 알아보기 위해서는


top 


이라는 명령어를 사용하곤 했습니다. 사실 이와 관련된 포스팅도 한 번 한적있고요 (http://ngee.tistory.com/76)


아래 그림은 리눅스 서버에서 top를 실행한 화면이구요.



근데, 이 top 명령어는 기본적으로 제공되는 것이구요.


단점이라기 보다는, top 보다 CPU와 메모리 점유율에 대해서 상세하고, 보기 좋게 출력해주는 것이 있습니다.


htop 이라는 것인데요. 이것은 apt-get 을 통해서 설치하셔야 합니다.


apt-get install -y htop


실행은 htop을 입력하시면 되구요.


아래 그림이 htop의 실행결과화면 입니다.



잘 보시면, cpu 코어별로 얼마나 사용되고 있는지 보여주고 있습니다.


또한 top과 다르게 폰트색이 적절하게 적용되어 더 깔끔하구요.

 

반응형
LIST
반응형

우분투 버전이 11.10 버전 이상의 경우 apt 명령어로 바로 설치가 가능하다.


sudo apt-get install mosquitto


혹시 최신의 버전을 사용하고 싶을 경우에는 ppa를 추가한다.


sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa

sudo apt-get update


ppa를 추가하고 install 하게 되면 최신 버전의 mosquitto가 설치된다.



=======================

 2015.03.08 01:41

Mosquitto 란 MQTT 의 오픈소스로 간단히 말하면 메세지 서버 입니다.



간단히 개념을 짚고 넘어 가자면


Mosquitto_pub -> Mosquitto Broker -> Mosquitto_sub


Mosquitto_pub 는 Publish 로 발행자를 의미합니다. 메세지를 보내는 역할을 하고요.


Mosquitto Broker 는 중간에 메세지를 각 클라이언트한테 전달, 관리 하는 역할으르 합니다.


Mosquitto_sub 는 Subscribe 로 구독자, 메세지를 받는자를 뜻합니다. 각 토픽(채널)에 접속해서 다른 메세지를 받을수 있으며 기본적으로 아이디와 비밀번호의 적용이 가능합니다.


더욱 자세한 내용은 구글링을 추천 드립니다.


Ubuntu 에서의 설치 방법은 간단합니다.


우선 저장소 업데이트를 위해 아래의 명령어를 실행하여 주도록 합니다.


1
2
3
sudo apt-get install python-software-properties
sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
sudo apt-get update


그리고 정상적으로 업데이트 되었는지 확인하여 봅니다.


1
sudo apt-cache search mosquitto




이제 mosquitto를 설치하시면됩니다.


1
sudo apt-get install mosquitto


설치가 모두 완료 되었다면 이제 실행해서 정상적으로 작동하는지 확인합니다.


1
mosquitto



기본적으로 1883 포트를 이용하며 설정 파일은 패키지 설치시 /etc/mosquitto/conf.d 에 *.conf 로 넣으시면 됩니다.


이제 다른 컴퓨터 혹은 다른 장비에서 클라이언트를 설치하고 접속을 확인해 보도록합니다.

*여기서는 VM 을 이용하여 테스트해보았습니다.


클라이언트는 위와 같은 방법으로 저장소 업데이트 까지 진행한 후 mosquitto 대신 mosquitto-client 를 설치합니다.

*클라이언트는 여러 종류가 있을 수 있습니다. 여기서는 간단하게 하기위해 mosquitto-client 를 이용할 뿐입니다.


1
sudo apt-get install mosquitto-clients


그리고 아래의 명령어로 위에서 실행한 서버에 접속을 시도 합니다.


1
mosquitto_sub -h 서버 주소 -t /토픽


위는 구독할때 그리고 아래는 메세지를 보낼때 사용하는 명령입니다.


1
mosquitto_pub - h 서버 주소 -t /토픽 -m "메세지"


토픽은 채널과 같은 역할을 하며 서버 주소는 말그대로 IP 혹은 도메인을 뜻합니다.

아래는 예제 결과 입니다.


-p 는 포트를 말합니다. 저 같은경우 기본 포트가 아닌 다른 포트를 이용하였기 때문에 넣어 주었습니다.




반응형
LIST

+ Recent posts