2014. 10. 2. 01:49

모든 UI어플리케이션은 메인 메뉴와 타스크 전환자에서 실행이 가능하며 서비스 어플리케이션은 다른 어플리케이션에 의해서 실행될 수 있다.  또한 모든 어플리케이션(UI와 서비스 어플리케이션)은 디바이스가 등록된 조건과 부합된 상태가 되었을 때 실행될 수 있다. (예: 특정 시간, NFC관련 데이터 수신 등)  어플리케이션이 실행되면 프로세스 메니져(Process Manager)는 필요한 라이브러리와 어플리케이션의 실행 바이너리를 메모리에 적제하고 어플리케이션의 인스턴스가 시작 포인트- OspMain() 메소드 - 에서 생성되고 실행된다. 


어플리케이션의 라이프 사이클

생성되어 실행된 모든 UI어플리케이션과 서비스 어플리케이션은 다음 그림의 왼쪽과 같은 기본적인 라이프 사이클을 갖는다.  UI어플리케이션의 경우, 추가적으로 우측의 프레임 라이프 사이클을 포함하며 생성하된 AddFrame() 메소드가 호출 될 때 초기화(OnInitializing) 된다.

어플리케이션이 실행되면 OnAppInitializing() 이벤트 핸들러가 호출되고 이때 프레임이 추가된다. 만약 실패하면 어플리케이션이 종료된다.



어플리케이션의 상태 전환
모든 타이젠 네이티브 어플리케이션들은 위 그림의 왼쪽 라이프 사이클의 4개 이벤트 핸들러에 대응하는 4가지 상태를 갖는다.


1. 초기화 중 상태(Initializing)
- 어플리케이션 프레임워크가 어플리케이션을 초기화 한다. (Tizen::App::App)
- 이전 실행에서 저장된 어플리케이션의 데이터가 복구될 수 있다.(Tizen::App::AppRegistry 클랫)
- UI어플리케이션의 경우, 어플리케이션의 프레임이 생성되어야 한다. (Tizen::App::UiApp)

2. 실행 중 상태(Running)
- UI어플리케이션이 실행중이라면 포그라운드나 백그라운드 모드간 전환이 가능하고, 전환 과정에서 어플리케이션의 프레임의 상태가 변경된다.

3. 종료 중 상태(Terminating)
- 어플리케이션이 리소스를 해제하고 상태를 저장한다.

4. 종료 상태(Terminated)
- 어플리케이션 프레임워크가 메모리로부터 어플리케이션을 제거한다.

프레임의 상태 전환 
어플리케이션이 초기화 된 후에는 실행 상태가되고 프레임은 활성화(Activated), 비활성화(Deactivated), 최소화(Minimized)와 같이 3가지 중 한가지 상태를 갖게 된다. End 키를 누르거나 시스템 리소스가 부족할 경우, 어플리케이션은 종료될 수 있으며 OnAppTerminating 이벤트 핸들러가 호출되어 어플리케이션의 리소스를 해제하고 어플리케이션이 프레임을 삭제하면 프레임의 상태는 파괴화(Destroyed)된 상태가 된다.


1. 활성화 상태(Activated) : 입력 디바이스로부터 이벤트를 받고 화면에 보여지는 상태
2. 비활성화 상태(Deactivated) : 다른 앱이 활성화 상태가 되면 활성화 상태 앱은 비활성화 상태가 된다. 이 상태에서 입력은 받을 수 없다. 비활성화 상태의 앱은 부분적으로 화면에 보여질 수 있다. (예를 들어 시스템 팝업창이 뜨면-전화가 오거나 알람이 울리면- 앱은 비활성화 상태가 된다.)
3. 최소화 상태(Minimized) : 새로운 프레임이 기존 프레임을 완전히 덮으면 기존 프레임은 최소화 되면 화면에서 사라진다. (예: 홈키가 눌렸을 경우, 다른 UI애플리케이션이 실행되었을 경우) 최소화 상태가 되면 3D또는 애니메이션 작업과 같은 그래픽 처리는 중단되어야 하며 불필요한 리소스는 해제되어야 하고 미디어 처리와 센서 관리는 중단되어야 한다.  따라서 최소화 상태에서 다시 활성화 상태가 되면 중단되었던 작업들이 재시작되어야 한다.
4. 파괴화 상태(Destructed) : Tizen::App::App 클래스의 Terminate()메소드가 호출되거나 시스템의 리소스(메모리 또는 배터리 파워)가 부족한 경우 앱이 종료될 수 있다.  앱의 종료는 OnAppTerminating()이벤트 핸들러에 의해서 관리된다.

Posted by 모바일헌터
2014. 9. 26. 23:30

91년 처음 C언어 책을 펼쳤을 때 제일 먼저 만들어 보았던 "Hello World" 어플을 만들어보자


여러분이 프로그램책을 한번이라도 읽으신 경험이 있으시다면 Hello World 프로그램을 만들어 보셨을 것입니다.  아마도 "Hello World" 앱을 작성하면서 기본적인 언어의 구조를 파악하고 개발환경에 대한 소개를 접하며 컴파일을 통해 자신의 첫번째 앱을 손쉽게 만들어 봄으로써 자신감을 얻으실 수 있을 것이라고 생각합니다.


Xcode 6.0을 기준으로 작성하였다.

목표를 확인하자!


프로그램을 실제로 만들기 전에 우리가 만들 "Hello World" 앱을 한번 살펴보자. 간단하게 Hello World 버튼을 중앙에 위치시키고 버튼을 클릭하였을 때 Hello World라는 메시지창을 만들어보았다. 이 복잡하지 않은 앱이 여러분의 첫번째 타이젠 네이티브 앱이 될 것이다.

Xcode를 실행


를 Launchpad에서 찾아서 실행해보자!


새로운 프로젝트를 생성하자


 위에서 Xcode를 실행했을 때 보이는 창에서 "Create a new Xcode project" 선택

    또는 메뉴에서 File→New→Project... 선택 

    또는 단축키 ⌘N를 사용

 새로운 프로젝트를 위한 템플릿으로 "Single View Application"을 선택하고 "Next" 버튼을 클릭하자. 계속된 글에서 다양한 템플릿을 이용한 예제만들기를 수행할 예정이다.

 포로젝트를 생성하기 위해서 필요한 옵션들을 입력할 수 있는 창이 보여지는데 

  - Product Name:  "HelloWorld" - 여러분의 앱의 이름

  - Organization Name: "Mobilehunter" - 여러분들의 회사명 (여러분을 대표할 만한 단어)

  - Organization Identifier:  "net.mogilehunter" - 회사의 도메인 명 (여러분을 대표할 만한 단어조합)

  - Language: Objective-C - swift를 이용한 예제는 다른 쓰레드에서 올리겠다.

  - Deivce: iPhone을 선택하고 Next 버튼을 클릭하자.


 작업 폴더를 선택하고 "Create" 버튼을 클릭하여 프로젝트를 생성하자. 

- 버전관리를 위해서 git을 사용하여 로컬 저장소를 만들 것인지 물어보는 옵션이 있는데 이번에는 선택하지 않도록 하자. git을 이용한 버전 관리는 다른 쓰레드에서 설명할 예정이다.

 Xcode가 여러분들이 선택한 옵션에 맞게 "Hello World"프로젝트를 생성하였다.

- 앗~! 새로 구입한 컴퓨터에서 아직 Signing을 진행하지 않았네요. 아직 개발자 등록을 하지 않으셨구요? 사이닝을 하지 않아도 에뮬레이터에서 생성한 앱을 확인할 수 있습니다. 

 아무 코드도 작성하지 않았지만 템플릿만으로 앱을 빌드하여 실행할 수 있다. 좌측 상단에 위치한 실행 버튼을 클릭하여 어플을 실행해보자.

- XCode는 자동으로 선택된 "iPhone6" 에뮬레이터를 실행하고 앱을 실행한다. 앱이 실행될 때 아래의 화면을 볼 수 있으며 이 화면은 "LaunchScreen.xib"에서 확인할 수 있다.


- 하지만, 실제 앱 화면에서는 아래와 같이 아직 아무것도 보이지 않는다.

- 앱이 실행되면 중지(Stop)버튼이 활성화된다. 중지 버튼을 클릭하여 실행된 앱을 종료하고 코드를 작성해보자.



스토리보드를 이용하여 UI와 코드를 작성하자



 Main.storyboard를 선택하고 중앙 Button을 삽입해보자.

- Navigator의 Project Navigator() 뷰에서 Main.storyboar파일을 선택한다.

- 좌측 Utilities에서 Object Library 버튼을 ()을 누르거나 메뉴에서 View→Utilities→Show Object Library를 선택하고 Button을 찾아 Main.storyboard 에 삽입하자.

- 버튼의 Title을 변경하기 위하여 버튼을 더블클릭하거나 Attribute Inspector()에서 Title을 "Hello World"로 수정해보자.


 이제 액션(actions) [혹은 아웃렛(outlets)]을 생성해보자.

- "Show The Assistant Editor"버튼()을 클릭하거나 View→Assistant Editor→Show Assistant Editor를 선택하면 ViewController.m 파일이 하단에 보여진다. (Assistant Editor의 위치는 View→Assistant Editor메뉴에서 변경할 수 있다.)



※ 아웃렛은 객체와 연결되는 인스턴스 변수이며 액션은 객체와 연결된 메서드이다.


^ (control)키를 누른 상태에서 버튼을 선택하여 ViewControler.h에서는 @interface와 @end사이, Viewcontroler.m에서는 @implementation과 @end사이로 드래그해보자.  



- 팝업창이 생성될것이다.  Connection은 Action으로 선택하고 Name을 showMessage라고 입력하고 연결해보자.



- ViewController.m의 메소드를 다음과 같이 수정해보자.

1
2
3
4
5
6
7
8
9

- (IBAction)showMessage:(id)sender {

    UIAlertView *hellowWorldAlertView = [[UIAlertView alloc]

                                         initWithTitle:@"Hello World"

                                         message:@"Hello World"

                                         delegate:nil

                                         cancelButtonTitle:@"OK"

                                         otherButtonTitles:nil];

    [hellowWorldAlertView show];

}


- 이제 앱을 실행하여 목표를 당성하였는지 확인해보자!

'개발 거들기 > iOS 개발' 카테고리의 다른 글

설치 후 처음 실행이라는 것을 파악하기  (0) 2015.03.07
Posted by 모바일헌터
2014. 9. 24. 17:10

위치기반으로 폰사용 프로파일을 자동으로 조정하여 주는 타이젠 어플을 제작하고 있습니다.
 iOS와 Android로도 제작을 진행할 예정입니다.

git 저장소: https://github.com/mobilehunter/passion

in-door에서는 비콘을 이용하여 좀 더 정밀한 지원을 할 예정입니다.


Posted by 모바일헌터
2014. 9. 23. 12:26


 AVD 생성

자! 이제 AVD Manager를 다시 실행해보자.

  1. $ adroid adv 

  2. Android Development Tool의 eclipse
    1. 툴바의 버튼을 클릭
    2. Window메뉴에서 Android Virtual Device Manager를 실행



 Create... 버튼 클릭하고 AVD를 설정한다.

  - AVD Name: AVD-Phone
  - Device: 원하는 디바이스를 선택
  - Target: 테스트를 원하는 타겟 디바이스의 Android Version을 선택
  - CPU/ABI: ARM 혹은 Intel 선택
  - Hardware keyboard present를 체크
  - Skin: 선택한 Device에 알맞은 스킨을 선택
  - Memory Options 와 Internal Storage는 테스트 목적에 맞게 변경
  - Emulation Options: Use Host GPU 체크

OK 버튼을 클릭하여 새로운 AVD를 생성하자.


 다음과 같이 설정정보를 표기한다. 


 AVD를 실행해보자.

- AVD를 선택하고 Start...버튼을 클릭
- Launch Options 팝업에서 Launch 버튼을 클릭 


시스템에 따라서 오랜 시간이 걸리는 경우가 있으니 인내심을 갖고 기다려보자.

새로 생성된 AVD가 실행되었습니다. 앞으로 실제 디바이스 없이도 개발된 앱을 확인하실 수 있습니다.


"emulator -avd avd_name" 명령어를 이용하여 생성한 AVD를 실행해보자~.

$ emulator -avd AVD-Phone 

단축키 - 1) Home : Android의 홈화면, 2) F2 : 메뉴키, 3) esc : 뒤로가기 키, 4) control+F11 : 가로세로 변경


 AVD 이상동작 시 삭제 

에뮬레이터가 갑자기 죽었을 경우 안드로이드 가상 디바이스실행도 되지 않고 삭제하려 할 때, 실행중이라며 삭제조차도 되지 않는 경우가 있다. 이럴경우 AVDM은 이 문제를 해결할 수 없다.


  1. Home 폴더로 이동한다. "cd ~/"
  2. .android폴더의 하위 avd폴더로 이동한다. "cd .android/avd"
  3. rm -r {device-name}.avd {device-name}.ini


'개발 거들기 > Android 개발' 카테고리의 다른 글

Android SDK and Path  (0) 2014.09.22
안드로이드 샘플 - ApiDemos  (0) 2014.09.21
0-1. Eclipse ADT Bundle 설치  (0) 2014.09.12
Posted by 모바일헌터
2014. 9. 22. 20:30

Android Development Kit을 /Users/account/adt-bundle-mac 폴더에 압축을 풀었다. eclipse와 sdk가 하위 폴더 이므로 루트 폴터에서 .bash_profile파일을 수정(없다면 생성)하여 PATH를 수정해보자. 1) tools와 2) platform-tools 폴터를 추가하면 된다.

$ vi ~/.bash_profile

export ANDROID_HOME=/Users/account/adt-bundle-mac/sdk export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools

물론, 다음과 같은 방법을 사용할 수도 있다.

  1. Terminal을 실행한다. 
  2. "cd ~/"를 입력하여 홈 폴더로 이동한다. (터미널을 시작하면 홈폴더이다)
  3. "touch .bash_profile"이라고 입력하여 새로운 파일을 생성한다.
  4. 자신이 가장 좋아하는 에디터를 이용하여 내용을 수정합니다. ("open -e .bash_profile"이라고 입력하시면 TextEdit에서 파일을 수정할 수 있다.)
  5. 위의 내용을 추가하시고 저장을 하신 후에 ". .bash_profile"이라고 입력하여 .bash_profile을 재로드하여 추가사항을 반영하시면 됩니다.

자! 이제 터미널의 어느 폴더에서나 adb를 사용해보자!

'개발 거들기 > Android 개발' 카테고리의 다른 글

0-2. Android Virtual Device manager  (0) 2014.09.23
안드로이드 샘플 - ApiDemos  (0) 2014.09.21
0-1. Eclipse ADT Bundle 설치  (0) 2014.09.12
Posted by 모바일헌터
2014. 9. 21. 02:36

한 가지 프로그래밍 언어를 어느 정도 익힌 상태에서 또 다른 언어 혹은 플랫폼 개발방법을 배울 때 가장 쉬운 방법은 많은 샘플과 소스를 접해보는 것이었습니다.  대개의 UI의 경우 사용자에게 보여지는 부분이 비슷하며 심지어 서버/데이터베이스 등과 같은 써드파트와 연결되는 인터페이스 영역이 비슷하기 때문이라고 생각한다.

우선, 안드로이드에 포함되어 있는 샘플들을 살펴봄으로써 안드로이드 개발에 좀 더 친숙해져보자.

0. 샘플을 Android SDK Manager에서 다운로드합니다. 
API별로 Samples for SDK가 존재한다. 최신 버전의 샘플을 선택하여 작업을 해보자.

1. File → New → Project... (또는 Package Explorer → New  →  Project...)

2. Android → Android Sample Project → Next

3. 최신 Target "Android 4.4.W"  →  Next

4. "legacy > ApiDemos"  → Finish

5. 에러수정 (외부 라이브러리 삽입)
5.1 프로젝트 Properties (Project → Properties)
5.2 Java Build Path 
 → Libraries → Add External JARs...
5.3 {ADT location}/sdk/extras/andoid/support/v4/android-support-v4.jar

이제 무리없이 소스가 컴파일 될 것이다.

6. Android Virtual Device Manager를 이용하여 에뮬레이터를 수행하고 ApiDemos 앱을 실행해보자!






'개발 거들기 > Android 개발' 카테고리의 다른 글

0-2. Android Virtual Device manager  (0) 2014.09.23
Android SDK and Path  (0) 2014.09.22
0-1. Eclipse ADT Bundle 설치  (0) 2014.09.12
Posted by 모바일헌터
2014. 9. 20. 02:42

소프트웨어를 개발할 때 개발자들에게 가장 큰 골치거리 중에 하나가 소스의 관리이다.  혼자 개발을 해도 관리가 어려운데 실제 직장에서는 혼자 개발할 수 있는 프로그램은 그렇게 많지 않아 항상 여러 명의 개발자가 공동 작업을 하게 되고 따라서 소스의 관리는 무엇보다 중요한 업무 중에 하나가 된다.

무슨 파일이 어떤 목적을 위해서 수정되었는지에 대해한 상세 기록을 통해서 소스의 수정사항들을 추적하고 관리할 수 있도록 도와주는 형상관리 툴은 개발을 진행하는 상황에서도 손쉽게 특정 소스에서 일부 버그만을 수정한 핫픽스 버전을 발행하는 등 다양한 소스 관리 방법도 제공을 한다.

다양한 형상관리 툴이 존재하지만 git은 리누스 토르발스가 리눅스 커널 개발에 이용하려고 개발하였으며 현재 널리 사용되고 있다. git은 많은 부분에서 cvs나 svn과 같은 다른 형상관리 툴과 기능은 비슷하지만 로컬 저장소(Local Repository)만 혹은 로컬 저장소와 원격 저장소(Remote Repository)를 함께 사용할 수 있다는 큰 특징을 갖고 있다. 네트워크에 접근하거나 중앙서버에 의존하지 않고 로컬에서 작업할 수 있다는 점은 특정 서버를 운영하지 않아도 된다는 장점이 있다. 또한, 인텍스(Index)라고 부르는 스테이징 영역(Staging Area)이 존재한다.  로컬 저장소에 커밋 할 파일들을 스테이지 영역에 추가하여 관리할 수 있다. 이러한 스테이징 영역과 스냅샷/브랜치를 잘 활용할 수 있다면 git을 제대로 사용하고 있다고 말할 수 있을 것이다.  그렇지 않다면 굳이 git을 사용해야 하는 이유는 없다.  


< 기본 명령어 정리>

- clone : 다른(로컬/원격) 저장소를 새로운 폴더에 복사 (작업폴더/로컬저장소가 생성)

- add : 작업내용을 스테이징 영역(Index)에 추가

- commit : 로컬 저장소에 작업내용을 기록

- push : 로컬 저장소의 내용을 원격 저장소

- fetch : 다른 (로컬/원격) 저장소로 부터 작업 내용을 내려받기

- merge : 내려 받은 데이터를 병합

- pull : 다른 저장소로 부터 작업 내용을 내려받고 다른 저장소 혹은 브랜치에 병합

- checkout : 브랜치를 선택하여 작업영역에 선택된 브랜치를 반영한다.

- brach : 브랜치들을 확인하고 특정 브랜치를 생성하고 삭제한다.

- cerry-pick : 다른 브랜치의 특정 commit내용을 가져온다.

- reset : 현재 HEAD를 특별한 상태로 리셋한다.





로컬 저장소 생성(.git 폴더)

- 기존 디렉토리를 Git 저장소로 만들기 

$ git init 

Initialized empty Git repository in /Users/mobilehunter/Developments/git-test/.git/


- 기존 저장소를 Clone하기

$ git clone [username]@[host]:[/remote/repository/location] 


git clone git://github.com/schacon/grit.git mygrit

Cloning into 'mygrit'...

remote: Counting objects: 4051, done.

remote: Compressing objects: 100% (2824/2824), done.

remote: Total 4051 (delta 1170), reused 4051 (delta 1170)

Receiving objects: 100% (4051/4051), 2.10 MiB | 508.00 KiB/s, done.

Resolving deltas: 100% (1170/1170), done.

Checking connectivity... done.


$ git clone [/local/repository/location]

git clone ~/Developments/git-test/mygrit

Cloning into 'mygrit'...

done.  


- 파일의 상태 확인하기

$ git status 

On branch master

Your branch is up-to-date with 'origin/master'


nothing to commit, working directory clean



clone에 의해서 작업폴더가 복사 되었거나 checkout에 의해서 작업 폴더가 생성되었을 때 모든 파일은 관리되며(tracked) 수정되지 않은(unmodified) 파일들로 구성된다. 새롭게 생성되는 파일(이나 로컬저장소에서 삭제된 파일)은 관리가 되지 않는 (untracked)파일이며, 관리가 되는 파일 중 수정이 이루어 지면 수정된(modified)파일이 된다.  수정된 파일 중  add명령에 의해서  스테이지 영역에 인덱스가 생성되어 커밋 명령에 의해서 로컬 저장소에 기록될(staged) 파일이 되며 tracked된다. commit에 의하여 staged 파일이 로컬 저장소에 반영되면 unmodified 파일이 된다.


- 파일 생성 (새로운 파일을 생성 - untracked file)

$ vi README

... 파일 생성/저장

$ git status

On branch master

Your branch is up-to-date with 'origin/master'


untracked files:

   (use "git add <file>..." to include in what will be committed)


           README


nothing added to commit but untracked files present (use "git add" to track)


- 파일 추가 (생성된 파일 staged file)

$ git add README

$ git status

On branch master

Your branch is up-to-date with 'origin/master'.


Changes to be committed:

  (use "git reset HEAD <file>..." to unstage)


          new file:   README 


- 파일 수정 (Tracked파일 중에 파일이 수정 - modified file)

$ vi benchmarks.rb

... test 추가 ...

$ git status

On branch master

Your branch is up-to-date with 'origin/master'.


Changes to be committed:

  (use "git reset HEAD <file>..." to unstage)


          new file:   README


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:   benchmarks.rb 


- 파일 추가 (수정된 파일 - staged file)

$ git add benchmarks.rb

$ git status

Your branch is up-to-date with 'origin/master'.

Changes to be committed:

  (use "git reset HEAD <file>..." to unstage)


          new file:   README

          modifed:   benchmarks.rb


- 수정사항 확인 (작업 폴더와 Staging Area 비교)

$ vi benchmarks.rb

... mobilehunter.net 추가 ...

$ git diff

diff --git a/benchmarks.rb b/benchmarks.rb

index 3e64fc3..6a3bb89 100644

--- a/benchmarks.rb

+++ b/benchmarks.rb

@@ -6,6 +6,7 @@ require 'ruby-prof'

 require 'memcache'

 require 'pp'

 

+mobilehunter.net

 

 #require 'grit'

 require 'lib/grit'


- 수정사항 확인 (Staging Area와 로컬 저장소 비교)

$ git diff --chached  or $ git diff --staged

diff --git a/README b/README

new file mode 100644

index 0000000..76e579a

--- /dev/null

+++ b/README

@@ -0,0 +1,2 @@

+test

+

diff --git a/benchmarks.rb b/benchmarks.rb

index e445e28..3e64fc3 100644

--- a/benchmarks.rb

+++ b/benchmarks.rb

@@ -1,3 +1,4 @@

+

 require 'fileutils'

 require 'benchmark'

 require 'rubygems'


- 변경사항 커밋하기

$ git commit



# Please enter the commit message for your changes. Lines starting

# with '#' will be ignored, and an empty message aborts the commit.

# On branch master

# Your branch is up-to-date with 'origin/master'.

#

# Changes to be committed:

#       new file:   README

#       modified:   benchmarks.rb

#


".git/COMMIT_EDITMSG" 10L, 285C



$ git commit -m "inline message" 


- Staging Area 생략하고 commit하기

 $ git commit -a -m 'added new benchmarks'

[master b703ffc] added new benchmarks

 2 files changed, 4 insertions(+)

 create mode 100644 README 


- 파일 삭제하기

$ rm grit.gemspec

$ git status

On branch master

Changes not staged for commit:

  (use "git add/rm <file>..." to update what will be committed)

  (use "git checkout -- <file>..." to discard changes in working directory)


          deleted:    grit.gemspec


no changes added to commit (use "git add" and/or "git commit -a") 


- 삭제 파일 추가 (삭제된 파일을 Stated 상태가 되게 한다)

$ rm grit.gemspec

$ git status

On branch master

Changes to be committed:

   (use "git reset HEAD <file>..." to unstage)


       delete: grit.gemspec


- 커밋 수정

$ git commit -m 'inital commit'

$ git add forgotten_file

$ git commit --amend 

첫 번째 commit은 무시되며 첫 번째 commit이 두 번째 위치에서 수정된 것과 동일한 결과를 갖는다.


- Unstage하기 (Staged 파일을 Unstage하기)

 $ git reset -- benchmarks.rb : 해당 파일을 index에 추가한 것을 취소하고 작업 폴더의 변경내용은 보전된다

 $ git reset HEAD benchmarks.rb : 위와 동일.


--soft: index보존, 작업폴더 보존

--mixed: index취소, 작업폴더 보존(기본 옵션)
--hard: index취소, 작업폴더 취소


- 수정한 파일 복구하기 (로컬 저장소에서 해당파일 다시 가져오기)

 $ git checkout -- benchmarks.rb              : 작업폴더에서 수정한 파일을 index에 있는 것으로 원복

 $ git checkout HEAD -- benchmarks,rb     : 작업폴더에서 수정한 파일을 HEAD에 있는 것으로 원복

 $ git checkout FETCH_HEAD -- benchmarks.rb : 작업폴더에서 수정한 파일을 FETCH_HEAD에 있는 것으로 원복


- 작업폴더 복구하기

 $ git reset --hard HEAD  : 작업폴더를 마지막 커밋 상태로 되돌림. 마지막 커밋 이후의 작업폴더와 index의 

                                           수정사항이 모두 삭제됨

 $ git checkout HEAD .     : 

 $ git checkout -f             : 


<원격 저장소관련>

- 원격 저장소 정보 관리

$ git remote -v

$ git remote add [단축이름] [원격 서버 주소] 


원격 저장소로부터 데이터를 가져오기 
(원격 저장소에서 데이터를 로컬 저장소로 갖고 온다.)

$ git fetch [remote-name] 


원격 저장소로부터 데이터를 가져오기 
(원격 저장소에서 데이터를 로컬 저장소로 갖고 오고 작업폴더와 머지까지 한다.)

$ git pull [remote-name] 


원격 저장소에 데이터 보내기 

(원격 origin 서버로 현재 master branch의 내용을 push)

$ git push origin master  (또는 git push)


원격 저장소 정보 확인/수정/삭제

$ git remote show [원격 저장소 이름] 

$ git remote rename [기존명] [신규명]

$ git remote rm [원격 저장소 이름]


원격 저장소를 옮기기

$ git remote rm origin

$ git remote add origin git@github.com:mobilehunter/{projectname}.git

 



- untracked 파일 제거

 $ git clean -f

 $ git clean -f -d  : 폴더까지 제거


- 파일무시: 생성/수정되더라도 관리되지 않는 파일이라고 표기 하지 않고 무시하기 위해서  .gitignore 파일에 추가

$ vi .gitignore

Debug 폴더를 무시하고 싶다면 다음과 같이 추가하여야 한다.

Debug/ 

run/


.gitignore에 표기하지 않고 git이 추적하지 못하도록(untracked 파일)하려면 staging area에서만 삭제하면 된다.

※ $ git rm --cached readme.txt


- 로그 확인

  $ git log 

  $ git log --pretty=oneline

  $ git log -p -2                    => -p 각 커밋의 diff결과를 보여준다. -2는 최근 2개의 결과


-태그 조회하기

$ git tag

$ git tag -l 'v1.4.2.*'

$ git show v1.4


-태그 붙이기(-a)

$ git tag -a v1.4 -m 'my version 1.4'


-태그에 서명하기(-s)

$ git tag -a v1.5 -m 'my signed 1.5 tag'


※ 태그와 브랜치를 혼동하는 사람이 있다. 태그는 일정 과거 시점을 표시하고 그 시점으로 쉽게 이동을 하거나 브랜치 혹은 특정 태그와의 비교 작업을 용이하게 할 수 있다.

다음의 





- remote branch를 가져오기

 $ git branch -b local_branch_name remote_branch_name

$ git branch -b next origin/next  

(local branch의 이름을 remote와 동일하게 하고 싶을 경우)

or 

$ git branch -b next_local origin/next

(local 브랜치의 이름을 변경하고 싶을 경우)


- branch 이름 변경

 $ git branch -m old_branch_name new_branch_name


- git의 전체 환경설정

git을 사용하기 전에 몇가지 전역 값을 설정하는 것이 편리하다. 우선, 첫번째는 이름과 이메일이다.

  $ git config --global user.name ["name"]

  $ git config --global user.email ["email"]


$ git config --global core.editor [vi]


color.ui값을 "auto"로 설정하여 여러 색을 이용한 출력 결과를 터미널에서 확인할 수 있다.

$ git config --global color.ui true


$ git config format.pretty oneline


설정값들이 제대로 잘 저장되었는지 확인해보자

  $ git config --global --list 


※ Staging Area = Index = Git Index



삼성 오픈소스 컨퍼런스에서 서울대 박성재님이 발표했던 내용입니다.




'개발 거들기' 카테고리의 다른 글

소스를 블로그에 올릴 때  (0) 2016.05.12
ATOM에서 TODO관리하기  (0) 2015.12.21
git 로컬 저장소 생성(.git 폴더)  (0) 2015.01.14
git 수정사항 확인  (0) 2015.01.14
Ubuntu에 Apache + Tomcat + MySQL 설치  (0) 2014.10.24
Posted by 모바일헌터
2014. 9. 19. 03:42

[ Application Settings Editor ]

Application Settings는 각 어플리케이션을 위하여 사용자의 설정을 저장하기 위한 기능이다.  

- "Application Settings"는 IDE에서는 Project의 setting디렉토리 밑에 위치하는 setting.xml파일에 포함


- 실제 폰에서는 Settings의 Downloaded applications 메뉴에서 다운로드된 애플리케이션들의 설정정보를 보고, 수정할 수 있다.




Application Settings Editor를 이용하여 setting.xml파일을 만들어보자.

- File → New → Other → Tizen → Tizen App Setting File

- Project Explorer view에서 프로젝트를 선택하고 왼쪽 마우스 버튼을 클릭하고 New→Tizen App Setting File

XML파일은 다음과 같은 엘리먼트들로 구성되며 파일이 처음 생성되었을 경우 <settings>가 구성되어 있으며 <settings>에서 <setting>을 "Add Setting ChildElement" 옵션을 이용하여 추가할 수 있다.

 엘리먼트

 내용

 <settings>

 setting.xml의 루트 엘리먼트 

 <setting>

 settings를 표기 위한 각 페이지를 위한 엘리먼트 (그런데 실제로는 1개의 setting만 허락됨으로 굳이 <settings>내에 <setting>를 다시 표기하는 이유는 모르겠다.

 <group>

아래의 setting값들을 그룹으로 묶어서 표기할 수 있다.

 <bool>

토글 컨트롤로 on/off를 표기한다.

 <integer>

스핀 컨트롤로 일정 범위의 수를 표기한다.

 <string>

수정가능한 텍스트 컨트롤로 문자열을 표기한다. 

 <label>

수정이 불가능한 텍스트 레이블 컨트롤로 문자열을 표기한다. 
 <expandlist>

여러 조건들 중 한가지를 고를 때 라디오 버튼들의 그룹을 표기한다.

 <expanditem>

expandlist의 각 조건들의 문자를 라디오 버튼과 표기한다. 

 <launch>

App 컨트롤을 실행하기 위한 엘리먼트이다. (...)





Posted by 모바일헌터
2014. 9. 16. 02:24

91년 처음 C언어 책을 펼쳤을 때 제일 먼저 만들어 보았던 "Hello World" 어플을 만들어 봅시다.


여러분이 프로그램책을 한번이라도 읽으신 경험이 있으시다면 Hello World 프로그램을 만들어 보셨을 것입니다.  아마도 "Hello World" 앱을 작성하면서 기본적인 언어의 구조를 파악하고 개발환경에 대한 소개를 접하며 컴파일을 통해 자신의 첫번째 앱을 손쉽게 만들어 봄으로써 자신감을 얻으실 수 있을 것이라고 생각합니다.


Tizen SDK 2.2.1을 기준으로 작성하였다.



타이젠 SDK설치  


만약 Tizen SDK를 아직 설치하지 않으셨다면 "0-1. 타이젠 SDK설치"를 참조하시어 설치를 하신 후에 다음을 진해하십시오.


목표를 확인하자!


프로그램을 실제로 만들기 전에 우리가 만들 "Hello World" 앱을 한번 살펴보자. 간단하게 타이틀에 Hello World!를 표기하고 OK 버튼을 중앙에 위치시켜 보았다. 이 복잡하지 않은 앱이 여러분의 첫번째 타이젠 네이티브 앱이 될 것이다.





Tizen IDE를 실행


Tizen IDE()를 SDK가 설치된 폴더 하위 폴더인 ide 폴더 안에서 찾아서 실행하자!

 Workspace Launcher에서 Workspace의 위치를 설정하자! Tizen IDE에서 생성하는 프로젝트들이 저장될 폴더를 workspace라고 한다.


 만약 workspace를 처음 선택하신 것이라면 다음과 같은 환영 창을 보실 수 있다.


새로운 프로젝트를 생성하자


 새로운 프로젝트를 생성하자

- menu에서 file  new →  (project...  → tizen  → ) Tizen Native Project 혹은
- Project Explorer에서 Secondary Click  →  new →  (project...  → tizen  → ) Tizen Native Project


  Template를 선택하고 Tizen Native 트리에서 Form-based Application을 선택한다. 

- With SceneManager나 Without SceneManager 문제가 안된다. 나중에 SceneManager에 대해서 설명할 예정이다.

 템플릿으로부터 workspace 디렉토리에 소스가 생성되었다.



UI Builder를 이용하여 리소스를 수정하자


 "UI Builder"를 실행해보자!
- Project Explorer에서 HelloWorld→res→screen-size-normalIDL_FORM.xml 파일을 더블클릭 하거나

- Project Explorer에서 HelloWorld에서 오른쪽 마우스를 클릭하고 메뉴에서 "Run Native UI Builder"를 선택하자.


 UI를 수정하자!

- 외쪽 상단의 "Outline" view에서 IDL_FORM을 선택하고 Header를 선택하거나 중앙의 "Form" view에서 "Hello Tizen!"이라고 적혀있는 Head 영역을 직접 클릭해보자.

- Header가 선택된 상태에서 좌층 하단의 "Properties" view에서 Title Text를 "Hello Tizen!"에서 "HelloWorld!"로 변경하고 저장하자.

HelloWorld를 빌드하자


  Project Explorer에서 HelloWorld Project를 선택하고
- menu → Project   Build Project 혹은
- F10 혹은
- 오른쪽 마우스 버튼을 클릭하여 프로젝트를 빌드하자.


  빌드가 정성적으로 에러없이 종료 되었다면 애뮬레이터에서 HelloWorld 앱을 테스트해보자.

- 앱을 테스트 하기 위해서는 애뮬레이터를 실행하거나 실제 디바이스를 연결해야 한다.

- 애뮬레이터나 실제 디바이스에 앱을 설치하기 위해서는 


애뮬레이터를 연결하자


  Connection Explorer view에서 애뮬레이터 메니져 버튼을 클릭하여 실행하자.

  새로운 VM을 생성하기 위해서 + 버튼을 누르고 VM의 이름을 Detail에서 입력하고 Confirm 버튼을 누르자.

  생성된 VM하단의 ▶버튼을 클릭하여 애뮬레이터를 실행하자. 

  다으모가 같이 애뮬레이터가 실행된다.


 애뮬레이터가 실행되면 Connection Explorer가 어떻게 변경되는지 확인해보자.


개발자/판매자 Certificate를 생성 등록


 사이닝 관련 작업을 수행하지 않았다면 다음과 같은 에러 다이얼로그를 보게된다.

     [타이젠 앱 보안관련 아키텍쳐]

  Preferences > Security Profiles 를 선택하시고 개발자와 배포자 시그니쳐를 생성해보자!

  - Tizen SDK → Security Profiles를 선택하고 Security Profiles를 추가해보자. (Add 버튼 클릭!)

 Profile Name을 입력하자.

 Generate 버튼 클릭

Hello World 프로그램을 실행해보자.


 Project Explorer에서 HelloWorld를 선택하고 

    * menu에서 Run → Run 혹은
    * ⌘ F11 혹은
    * 오른쪽 마우스를 클릭하고 Run As 
  1. Tizen Native Project



수고하셨습니다.

  


Posted by 모바일헌터
2014. 9. 16. 02:18

모바일 디바이스 시스템과 유저 개인적인 데이터를 효과적으로 보호하기 위하여 타이젠 보안 아키텍쳐는 권한(privileges)과 리눅스의 기본 보안 모델의 앱 사이닝 기반의 보안 아키텍쳐를 사용한다.

  • 권한(Privileges) : 보안에 민감한 API들을 사용할 경우 요청된 권한을 정의해야만 한다.
    • 안드로이드의 Menifest에서 정의되는 Permission에 대응하는 구조이다.
  • 앱 사이닝(Application signing) : 타이젠 앱은 개발자와 배포자의 시그니쳐에 의해서 서명되어야 한다.
    • 개발자 시그니쳐 (Author Signature)
    • 배포자 시그니쳐(Distributor Signature)
  • 사생활관련 API를 위한 예외처리 관리(Exception handling for privacy-sensitive APIs)

[Check API and Privilege Violations]
API와 Privilege의 위한 사항에 대해서 Project 메뉴에 "Check API Violation", "Check Privilege Violation", "Check API and Privilege Violations" 메뉴를 활용하여 개발 중에 확인 할 수 있다. 

체크 결과는 Problem 뷰에 Infos 트리에 표기된다.

  • API Violation Type
    • API 버전 경고 (API version alarm)
      • API가 특정 버전 이후부터 제공되기 시작한 경우
        ☆ 특정 버전 이후부터 제공 되었기 때문에 manifest.xml의 Basic 탭에서 "Min API version"을 조정하거나 해당 API를 사용하지 않는 것이 좋다.
    • API 호환성 경고 (Compatibility alarm)
      • API가 버전별 호환성에 문제가 있는 경우
        ☆ 버전 별로 호환이 되지 않기 때문에 문제점을 확실히 파악하고 사용해야 한다.
    • API 삭제 경고 (Deprecated API alarm)
      • API가 특정 버전 이후부터 더 이상 사용되지 않는 경우
        ☆ 하위 호환성을 고려하여 실제로 삭제되는 경우는 드물다. 따라서 컴파일이되지만 중요도가 떨어져 더 이상 사용되지 않아 앞으로 사라지게 될 API이므로 가능하면 사용하지 않는 것이 바람직하다
  • Privilege Violation Type
    • Undefined privilege alarm
      • privilege의 추가를 필요로 하는 API를 사용하였지만 menufest에 추가되지 않은 경우
        ☆ menifest파일을 오픈하여 Privileges탭에서 해당 privilege를 추가한다.
    • Unused privilege alarm
      • menufest에 privilege를 추가하였지만 추가된 privilege에 속하는 어떤 API도 사용하지 않은 경우
        ☆ 불필요한 privilege는 삭제하고 만약 나중에 privilege에 속하는 API를 사용 예정이라면 무시한다.


[개발자와 배포자 시그니쳐를 생성해보자!]

1. Preferences를 실행하자.
  - menu → Tizen  IDE Preference or ⌘ + ,

  - Tizen SDK → Security Profiles를 선택하고 Security Profiles를 추가해보자. (Add 버튼 클릭!)

  - Profile Name을 입력하자.

- Generate 버튼 클릭






Posted by 모바일헌터