'Programming'에 해당되는 글 39건

  1. 2010.07.25 큐메세지
  2. 2010.07.25 안드로이드 프로세스 우선순위
  3. 2010.07.25 안드로이드 apk 파일 1
  4. 2010.07.25 TextView
  5. 2010.07.25 Intent를 이용한 지도 띄우기
  6. 2010.07.25 안드로이드 환경 설정
  7. 2010.07.12 Call By Reference
  8. 2010.07.12 Reference
  9. 2010.07.12 Namespace
  10. 2010.07.12 Linux에서의 초간단 Echo Server
2010. 7. 25. 18:48

사용자가 윈도우를 생성하거나 메모장같은 프로그램을 실행 해서 마우스나 키보드를 치게되면 마우스는 우리의 컴퓨터에게
전기적인 인터럽트 신호를 보낸다. 이신호는 결국 CPU가 받게되고.  CPU는 번호와 함수조소를 갖고있는 테이블을 하나 만든다.
이 테이블에는 몇번 인터럽트는 누가 처리하겠다는 정보를 담고 있다. 이테이블을 IDT(Interrupt Discript Table)라 한다.
이테이블에서 마우스번호에 해당하는 함수를 따라가다 보면 마우스드라이버가 있고 이 마우스드라이버는 발생된 메세지를
큐에다가 넣는다. 이 큐가 SHIQ(System Hardware Input Queue)이다. 

OS안에는 RIT(Raw Input Thread) 는 스레드가 있는데 가장 낮은 레벨의 입력을 처리한다.
또 OS에는 각 프로그램마다 큐를 갖고 있는데,  이 RIT가 SHIQ에서 메세지를 하나씩 꺼내와서 각 프로그램의 큐에 전달해 준다.

이 프로그램의 큐에서 메세지를 꺼내는 함수가 GetMessage()이다.

다음은 이과정을 그림으로 표현한 것이다.





'Programming > Win32 API' 카테고리의 다른 글

비큐 메세지  (0) 2010.07.07
윈도우열거  (0) 2010.07.07
윈도우 스타일 변경  (0) 2010.07.07
RegisterClass()와 RegisterClassEx()  (0) 2010.07.07
SetWindowLong()  (0) 2010.07.07
Posted by 어북어위크
2010. 7. 25. 16:34
* 우선순위 1
    - 화면에 보이며 사용자와 상호작용할 수 있는(즉, 포커스를 가진) 액티비티를 갖고 있는 프로세스 (onResume()이 호출된 
        액티비티를 갖고 있는 프로세스).
    - 실행중인 브로드개스트리시버를 갖고 있는 프로세스(onReceve()메소드를 실행중인 브로드캐스트리시버를 갖고 있는 
        프로세스).
    - 막 시작하는 서비스를 갖고 있는 프로세스(onCreate(), onStartCommand(), onDestroy()메소드가 실행중인 서비스를 
        갖고 있는 프로세스.

* 우선순위 2
    - 화면에 보이지만 활성화되지 않은(포커스를 가지지 않은) 액티비티를 갖는 프로세스.
    - 부분적으로 가려지거나 투명한 액티비티에 의해 가려진 경우.
    - onPause()메소드가 호출된 액티비티를 갖고 있는 프로세스.
         
* 우선순위 3
    - 시작된 서비스를 갖는 프로세스.

* 우선순위 4
    - 화면에 보이지 않는 액티비티를 갖는 프로세스.
    - onStop()메소드가 호출된 액티비티를 갖는 프로세스.
        
* 우선순위 5
    - 빈 프로세스
    - 다음 실행속도를 보장하기 위해 프로세스를 캐싱한다.

'Programming > Android' 카테고리의 다른 글

안드로이드 apk 파일  (1) 2010.07.25
TextView  (0) 2010.07.25
Intent를 이용한 지도 띄우기  (0) 2010.07.25
안드로이드 환경 설정  (0) 2010.07.25
Posted by 어북어위크
2010. 7. 25. 16:32

    안드로이드 환경에서 프로그램을 실행하면 아래 콘솔창에 Installing xxx.apk...이라는 로그를 볼수 있다.   
    이apk파일은 우리가 만든 프로그램을 ADT플러그인이 안드로이드sdk에 있는 개발도구를 이용해서 자동으로 만들어 주는
    파일이다.

                                                                                                     
    프로젝트를 생성하면 기본적으로 아래와 같은 파일이 생성된다. 여기에 있는 모든 파일들이 apk파일 하나로 만들어 지는 것 이다.
                   

    java파일을 컴파일 하게되면 .class이 생기는데 이.class파일은 JVM이 인식할 수 있는 바이트 코드 파일이다. 그런데, 
    안드로이드 환경 에서는 JVM이 아닌 Dalvik Virtual Machine이다. 그래서 이.class파일은 Dalvik에서 인식될 수 있는 포맷으로 
    다시 만들어 주어야 한다. 그 파일이 바로 .dex라는 파일이다. 이때 컴파일 할때는 javac도구를 이용하지만 이클래스 파일을 .dex
    파일로 변환할 때는 dx라는 도구를 사용한다. 이 작업은 사용자가 직접하지 않고 이클립스에서 자동으로 해준다.

    위의 파일중에 바이너리 형태가 아닌 리소스들 즉, UI관련 xml이나 자원관리용 xml 또는 이미지 파일들도 최소한의 메모리를 
    사용하게끔 컴파일 하게 된다. 그래서 dex파일과 컴파일된 리소스와 기존 바이너리 파일들이 다 합쳐서 apk파일이 생성 되는
    것이다. 이 apk파일이 실질적으로 단말기에 올라가서 실행되는 것이다. 

    아래 그림은 위에서 설명한 파일들이다. 
    dex, ap_, apk가 있는데, resources.ap_파일이 컴파일된 리소스이다.
   
  



    여기서 apk의 내용은 apk파일이 있는 폴더로 가서 android-sdk-windows\platforms\android-7\tools안에 들어있는
    aapt.exe로 확인할 수 있다.
    예> aapt list Hello.apk

    
    우리가 만든 프로그램을 마켓에 올려야 할 경우가 있는데, 디폴트로는 디버그용으로 signing되어서 apk파일이 만들어진다.
    릴리즈용으로 배포하기 위해선 디버그용으로 signing되지 않은 결과물을 얻어온 후에 인증키를 이용해서 릴리즈용으로 signing
    작업만 한번 더 해서 올리면 된다.

'Programming > Android' 카테고리의 다른 글

안드로이드 프로세스 우선순위  (0) 2010.07.25
TextView  (0) 2010.07.25
Intent를 이용한 지도 띄우기  (0) 2010.07.25
안드로이드 환경 설정  (0) 2010.07.25
Posted by 어북어위크
2010. 7. 25. 16:18

안드로이드에서 화면상에 글을 보여주기 위해서는 TextViewf를 사용한다. 윈도우 프로그래밍에서는
컨트롤과 같은 것이다.

기본적으로 프로젝트를 하나 생성 하면 TextView가 생기고 그위에 Hello World라는 글자를 보여준다.
여기서 돌아가는 흐름을 이해하기위해 하나 더 추가해서 예제를 만들어보자.

프로젝트를 생성하면 자동으로 main.xml과 string.xml파일이 생성된다.

           
main.xml은 기본적으로 생성되는 화면작업을 위한것 이고, string.xml은 화면작업을 위해 쓰이는 자원관리를 하는 파일이다. 화면에 어떤 글씨를 보여 줄지에 대한 정보가 모두 여기에 저장 되어 있다.













    그럼 main.xm을 사용해서 TextView를 디자인 해보자. 
    main.xml을 더블클릭 후 아래 Layout탭으로 이동해서 왼쪽의 Views에서 TextView위젯을 드래그&드롭으로 끌어다가 검은 화면 
    위에 올려 놓으면 끝이다. 오른쪽 Outline에서 TextView가 추가된것을  볼 수 있다. 

    
    또는 아래와 같이 xml파일에서도 TextView가 추가된것을 확인할 수 있다.

    
    아래 예제는 위에서 만든 TextView를 가져다가 값을 출력하는 부분이다. 2줄이면 코딩 끝~
    findViewById()는 해당 위젯을 찾는 함수이다. 인자로는 R.id.TextView01이라고 주었는데 여기서 R은 자원을 관리 해주는 
    클래스 이다. 사용자가 위젯을 하나씩 추가할때 마다.gen밑에 R.java라는 클래스에 사용자가 추가한 위젯의 아이디가 자동으로 
    등록되게 된다. 사용자가 등록한 모든위젯들의 아이디는 R.java클래스에서 참조하면 된다.
 
    

'Programming > Android' 카테고리의 다른 글

안드로이드 프로세스 우선순위  (0) 2010.07.25
안드로이드 apk 파일  (1) 2010.07.25
Intent를 이용한 지도 띄우기  (0) 2010.07.25
안드로이드 환경 설정  (0) 2010.07.25
Posted by 어북어위크
2010. 7. 25. 16:12
인텐트란 메세지 기반의 프레임웍이라고 보면 된다.
어떠한 일이 발생했다는 상황에 대한 정보(데이타)를 담고 있는 메세지다.
인텐트로 할 수 있는일은 매우 다양하다.다른 컴포넌트와도 통신이 가능하고, 화면전환 및 다른 서비스 컴포넌트를 실행할 때도 쓰일 수 있다.또 어떠한 상황이 발생했다는 상황정보를 알려주기 위한 브로드캐스팅에도 쓰인다.

아래 코드에서는 지도를 보고싶다는 인텐트와 핸드폰에 관한 인텐트를 발생시키면
안드로이드 플랫폼이 그 인텐트에 담긴 정보와 제일 적합한 화면을 찾게되고 사용자에게 보여준단.
즉 컴포넌트를 찾아서 사용자에게 보여주는 것은 안드로이드 플랫폼이 알아서 해준다. 

지도를 보여주기 위해서는 프로젝트 생성시 Build Target에서 Google APIs를 선택해야한다 


import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class IntentAppActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        Button mapButton = (Button) this.findViewById(R.id.mapButton);              // 지도버튼 생성.
        Button phoneButton = (Button) this.findViewById(R.id.phoneButton);         // 폰버튼 생성. 
       
        mapButton.setOnClickListener( new View.OnClickListener() {
   
           @Override
           public void onClick(View v) {
    
               Uri uri = Uri.parse("geo:37.4944732,127.05413818333334");                  // 좌표값 설정.
               Intent intent = new Intent( android.content.Intent.ACTION_VIEW, uri); // 인텐트 생성.  
    
               startActivity(intent);                                                                     // 액티비티 실행.
           }
    });

    phoneButton.setOnClickListener( new View.OnClickListener() {
   
        @Override
         public void onClick(View v) {
    
             Uri uri = Uri.parse("tel:555-1234");         // 전화번호 설정.
             Intent intent = new Intent( android.content.Intent.ACTION_DIAL, uri); // 인텐트 생성.  
    
             startActivity(intent);             // 액티비티 실행.
         }
      });
    }
}

아래는 실행 화면이다.

map 버튼 클릭화면.


phone 버튼 클릭화면.


'Programming > Android' 카테고리의 다른 글

안드로이드 프로세스 우선순위  (0) 2010.07.25
안드로이드 apk 파일  (1) 2010.07.25
TextView  (0) 2010.07.25
안드로이드 환경 설정  (0) 2010.07.25
Posted by 어북어위크
2010. 7. 25. 15:57

윈도우에서 안드로이드 개발환경을 설정해 보자.

1. JAVA SDK설치.
     - http://java.sun.com/javase/downloads/index.jsp

2. 안드로이드 SDK설치.
     -http://developer.android.com/sdk/index.html

3. 이클립스 설치.
     - http://www.eclipse.org/downloads/
     - Eclipse IDE for Java EE Developers 으로 다운로드.
     - 갈릴레오 버전 설치.

4. 안드로이드 이클립스 플러그인 설치(ADT)
     - 이클립스 -> Help -> Install New Software... -> 우측상단에 Add 클릭.


    Name, Location을 입력해야 한다.
    Name은 Android Plugin ADT으로(자기가 알아보기 쉬운것으로)입력하면되고.
    Location은 경로를 설정해줘야 한다.
    
    내용을 입력하기위해 아래 사이트로 이동.
    http://developer.android.com ->  SDK 탭으로 이동 -> 왼쪽메뉴에 ADT Plugin for Eclipse -> ADT 0.9.7 클릭. 
    내용중에 Downloading the ADT Plugin항목 에서의 "https://dl-ssl.google.com/android/eclipse/" 입력하거나,
    Troubleshooting ADT Installation 항목중에 "ADT-0.9.7.zip" 파일을 다운 받아서 파일 위치를 적어주면 된다.
    
    OK버튼을 클릭하면, 아래와 같이 나오는데 Developer Tools 체크하고 Next버튼 클릭


     아래 화면에서 Next버튼 클릭.


    라디오 버튼 체크하고 Finish 버튼 클릭.


    아래와 같이 설치되는 과정을 볼 수있다.         


        아래화면에서 체크박스 체크하고 OK버튼 클릭.
    

        Yes버튼 클릭.  

        
        이클립스가 재시작되고 아래그림에서 빨간줄친 항목이 보이면 설치 완료.


        플러그인 설치가 완료되었으면, 이클립스에서 안드로이드 SDK를 쓸 수 있도록 이클립스와 SDK를 연결해야 한다.

5. 이클립스와 Android SDK 연결.

      -  이클립스 메뉴에서 
         Windows->Preference 클릭 -> 좌측메뉴에 Android 항목 클릭 -> 오른쪽 SDK Location의 "Browse..." 버튼 클릭.
         위의 순서 2번에서 다운로드한 SDK 폴더(android-sdk-windows) 지정 후 Apply버튼클릭 -> OK 버튼 클릭.
         이로써 기본적인 환경설정은 끝이난다. 

        

'Programming > Android' 카테고리의 다른 글

안드로이드 프로세스 우선순위  (0) 2010.07.25
안드로이드 apk 파일  (1) 2010.07.25
TextView  (0) 2010.07.25
Intent를 이용한 지도 띄우기  (0) 2010.07.25
Posted by 어북어위크
2010. 7. 12. 22:58

void inc1(int x)
{
    return ++x;
}

void main()
{    
    int n = 10;
    inc1(n);
    cout << n << endl;
void inc2(int* x)
{
    return ++x;
}

void main()
{    
    int n = 10;
    inc2(&n);
    cout << n << endl;
void inc3(int& x)
{
    return ++x;
}

void main()
{    
    int n = 10;
    inc3(n);
    cout << n << endl;

Call By Reference는 Call By Pointer와 마찬가지고 함수 호출 시 인자의 값을 변경할 수 있다. 그렇다면 어떤것을 사용하는 것이 좋을까?

int num = 10;
foo(num);
foo(&num);

=> 명확성은 참조 보다 포인터가 더 좋다.

'Programming > C++' 카테고리의 다른 글

Reference  (0) 2010.07.12
Namespace  (0) 2010.07.12
* Inline Function  (0) 2009.11.20
* Overloading 된 함수 찾는 순서  (0) 2009.11.19
* Function Overloding  (0) 2009.11.19
Posted by 어북어위크
2010. 7. 12. 22:56

#include <iostream>
using namespace std;

void main()
{
      int  n = 10;
      int* p = &n;
      int& r = n;
 
      ++r;
      cout << n << endl;
 
      cout << &n << endl;
      cout << &r << endl;
 
     // int& r1; //Error
 
    // 기존 변수에 대한 또 다른 이름(별명)을 제공한다.
    // 동일한 메모리 영역을 공유한다.
    // 반드시 선언과 동시에 초기화 되어야 한다.
}

// 1. 포인터에 대한 레퍼런스는 만들 수 있으나 레퍼런스에 대한 포인터는 만들 수 없다.
void main()
{
      int    n = 10;
      int*   p = &n;
      int&   r = n;
      int*& rp = p;      // 포인터의 레퍼런스.
      cout << *rp << endl;
      int&* pr = &r;     // Error 레퍼런스를 가르키는 포인터 변수.
}


// 2. 함수, 배열 이름데 대한 레퍼런스를 만들 수 있다. 하지만 레퍼 런스의 배열을 만들 수 없다.
int square(int x){return x * y;}
void main()
{
      int ar[3];
      int (&r_ar)[3]  = ar;    // 배열의 레퍼런스.
      int (&r_f)(int) = square;  // 함수의 레퍼런스.
 
      r_ar[0] = 2;
      cout << r_f(ar[0]) << endl;
 
      int& arr[3];        // Error 레퍼런스 배열.
}

// 3. 변수가 아닌 상수에 대한 레퍼런스를 만드는 것도 가능하다.
void main()
{
      int& r1    = 10; //Error.
      const int& r2 = 10; // OK.
 
      int n = 10;
      const int& r3 = n;
 
      ++n; // OK.
      ++r3; // Error.
}

'Programming > C++' 카테고리의 다른 글

Call By Reference  (0) 2010.07.12
Namespace  (0) 2010.07.12
* Inline Function  (0) 2009.11.20
* Overloading 된 함수 찾는 순서  (0) 2009.11.19
* Function Overloding  (0) 2009.11.19
Posted by 어북어위크
2010. 7. 12. 22:55
// 이름 충돌을 막기 위한 도구.
// 이름 충돌의 가능성이 조금 줄어든다.
// 완전히 막을 수는 없다.

namespace one
{
    void foo() { cout << "one::foo" << endl; }
}

namespace two
{
    int n=10;

    void foo()  { cout << "two::foo" << endl; }      
    void goo() { cout << "one::goo" << endl; }
}

void main()
{
    using namespace one;     // one 안의 모든것을 "::" 없이 쓸 수 있다.
    using two::goo;               // two 안의 goo만 "::"없이 쓸 수 있다.

    foo();
    two::foo();

    goo();
    two::n=20;
}

'Programming > C++' 카테고리의 다른 글

Call By Reference  (0) 2010.07.12
Reference  (0) 2010.07.12
* Inline Function  (0) 2009.11.20
* Overloading 된 함수 찾는 순서  (0) 2009.11.19
* Function Overloding  (0) 2009.11.19
Posted by 어북어위크
2010. 7. 12. 20:13

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>

int main()
{
    int fd, new_fd, ret;
    char buff[1024];
    struct sockaddr_in my_addr = {0,};

    fd = socket( AF_INET, SOCK_STREAM, 0 );                               // 소켓생성.

    my_addr.sin_family     = AF_INET;
    my_addr.sin_port       = htons(7777);                                         // 포트번호 셋팅.
    my_addr.sin_addr.s_addr = inet_addr("192.168.200.129");             // 주소셋팅.

    if( bind( fd, (struct sockaddr*)&my_addr, sizeof my_addr) < 0 )   // 주소 바인딩.
    {
        perror("bind");
        exit(-1);
    }

    listen( fd, 10 );

    while(1)
    {
        new_fd = accept( fd, 0, 0 );                                                     // 클라이언트와 연결 및 새로운 소켓 생성.
        printf("새로운 클라이언트 접속 : new_fd=%d\n", new_fd);

        while( ret = read( new_fd, buff, sizeof buff ) )                           // 클라이언트로 부터 전송된 데이타 읽기.
             write( new_fd, buff, ret );                                                  // 읽은 데이타 전송

        printf("클라이언트 탈퇴 : new_fd=%d\n", new_fd);
        close( fd );
    }
    close( new_fd );

    return 0;
}


 

Posted by 어북어위크