오랜만에 Visual Studio 설치하고 Console 프로그램을 작성해봤다. 빈 c 파일이니깐...


#include "stdio.h"

void main(void)
{
	printf("Hello!\n");
}


아주 단순한 출력부터 해보았다.

얼래.. 아무키나 누르세요를 하지 않는다. 실행하자마자 바로 종료.


인터넷 좀 찾아보니 서브시스템 설정을 해주어야 한다.


프로젝트 -> 속성에 들어가서 아래와 같이 설정

여하튼 하위 시스템에 콘솔(/SUBSYSTEM:CONSOLE) 이라는 놈이 들어가야 한다.



그리고 확인 누른다음 F5를 누르면?



전에 비해 뭔가 말이 많아졌지만 여하튼 원하던 결과다.

VirualBox에서 vdi파일 크기 줄이기

Programming Info 2014. 3. 24. 08:21 Posted by AstinLen

제가 사용하는 Windows환경에서 VirualBox를 활용하여 Ubuntu를 사용하는데 실 용량은 7.9GB입니다.

VirualBox에서 해당 가상머신의 디스크를 동적확장저장소로 지정해놓았으나, 실제 HDD에서 사용하는 공간이... 20GB 가까이 되다보니 128GB짜리 SSD가 부담됩니다. 거의 2배 가까이 뻥튀기 되었네요.

이에 실 용량으로 줄이는 방법을 알아보았습니다.


그림1. 20GB 가까이 되는 가상머신의 디스크(동적확장저장소 방식)

 
그림2. 실제 차지하는 공간(7.9GB)

Ubuntu뿐만 아니라 그 외 리눅스 시스템에서는 대부분 적용될 것으로 보입니다.

1. Ubuntu Terminal에서 아래와 같이 명령을 내립니다. 1번째 명령에서 시간이 조금 걸립니다.


    sudo dd if=/dev/zero of=/bigemptyfile bs=4096k
    sudo rm -fr /bigemptyfile

만약 Windows 가상머신이라면 cmd창에서  

    sdekete -z      <= 해보진않았습니다.

2. 가상머신을 종료합니다.

3. Windows의 cmd를 실행시켜 아래와 같이 명령을 내립니다. 마찬가지로 시간이 조금 걸립니다.


     vboxmanage.exe modifyhd 경로/파일명.vdi --compact

이 명령의 경우 vboxmanage가 있는 경로에서 실행해야 합니다. 기본적으로 C:\Program Files\Oracle\VirtualBox와 같은 경로에 위치합니다. vdi 파일은 C:\abc.vdi라고 가정하면...
예시

    cd C:\Program Files\Oracle\VirtualBox
    vboxmanage.exe modifyhd C:\/abc.vdi --compact

결과는


그림3. 10GB정도로 줄어든 vid 파일

 

이상입니다.

이런쪽 내용은 잘 모르지만 커멘드로만 봐서는 가상머신HDD에 있는 쓰레기 데이터를 0으로 쓴 다음 해당 부분을 잘라내는 것같습니다. 리눅스에서 2개 명령중 1번째 명령만 내리면 HDD 사용률이 100%가 되버립니다. 필히 2번째 명령 내려주세요.

오늘은 간단합니다.

안드로이드 가상기기에서 Hello World 출력하겠습니다.

순서는
1. 안드로이드 프로젝트 생성
2. 가상기기에서 실행

 

 

1. 안드로이드 프로젝트 생성

(1) eclipse를 실행시킨 후 File → New → Android Application Project를 선택합니다. 

 

(2) 프로젝트 네임 / 어플리케이션 네임을 정해주시면 됩니다. 저는 hello라고 정했습니다. 그리고 Next
- Application Name : 실행되는 어플리케이션의 실제 이름
- Project Name : 이클립스에서의 이름
- Package Name :  패키지의 이름
- Minimum Required SDK : 어플리케이션이 돌아가는 기준이 되는 최소한의 OS SDK
- Target SDK : 개발할 기준이 되는 OS SDK
- Compile With : 컴파일러 할 기준이 되는 OS SDK

 

(3) 특별한것 없이 일단 Next를 합니다.
- Create custom launcher icon : 어플리케이션의 아이콘 설정 여부 : 4번에서 설명
- Create activity : 액티비티에 대한 설정 여부 : 5번에서 설명
- Mark this project as a library : 해당 프로젝트가 라이브러리 프로젝트인지를 정합니다.
- Create Project in workspace : 프로젝트 저장위치를 결정합니다. 체크하면 워크스페이스안에 생성이 되고 아니라면 개인이 설정한 위치에 저장됩니다.

 

(4) 아이콘 설정하는 페이지입니다. 여기도 Next로 넘어갑니다.
- 3번의 Create custom launcher icon을 체크해서 나타납니다.
- 프로그램의 아이콘에 대한 전반적인 부분을 설정할 수 있습니다.

 

(5) 액티비티를 설정하는 부분입니다. 여기도 일단 Next!
- 3번의 Create Activity를 체크해서 나타납니다.
- 어떤식으로 페이지를 만들 것인지에 대한 것입니다. 큰 신경안쓰셔도 되요.

 

(6)  5번에서 Blank Activity를 선택했기에 나타나는 페이지 입니다. 별다른 설정없이 Finish 눌러서 완료!
- Activity Name : 액티비티 이름입니다. 처음 만들어지는 페이지이니 main이 되겠죠
- Layout Name : 말 그대로 레이아웃 이름입니다.
- Navigation Type : 네비게이션 타입으로 여러 페이지를 만들때 사용합니다. 지금은 필요없으니 None!

 

(7)  드디어 프로젝트 하나를 만들었습니다!

 

2. 가상기기에서 실행

그럼 이제 실행을 시켜야 합니다.

그전에 한가지 팁을 알려드리자면.. 가상기기를 키는 것 조차.. 매우 오래 걸렸습니다.

제 기준에서는 몇분 걸렸네요.. 그런고로.. 개발하는 동안에는 가상기기를 끄지 맙시다..

켜둔상태로 계속 컴파일 하면서 실행을 할 수 있어요

 

(1) 가상기기 ON

Window → Android Virtual Device Manager을 선택합니다.

차례대로 클릭합니다. 

 

기다립니다.

가상기기가 나타났습니다. 부팅이 완료될때까지 기다립니다.

부팅이 완료되었습니다. 저는 2분 걸렸네요.. 여러분들은 어떠신가요..^^

 

(2) 컴파일하여 Hello World 출력 하겠습니다

Run → Run 하면 됩니다.

...

조금 기다려보면

 나타납니다...

 

혹시 안되시는 분들 계시다면.. 가상기기를 잠김모드에서 풀어보세요.. 실행되어 있는 상태일 것입니다.

그래도 안되어 있다 하시면

확실한건 아니지만 해보시길..^^;

 

이상입니다!

전체적인 진행과정은 아래와 같이 진행됩니다.

1. 자바개발환경(JDK) 설치하기
2. 안드로이드 SDK 다운로드하기(이클립스 포함)
3. 이클립스 실행하기

로 진행되겠습니다.

 

1. 자바개발환경(JDK) 설치하기

JDK는 이미 설치되어 있을 수 있습니다. 이에 따라 먼저 설치여부 및 버전을 확인합니다.
설치가 안되어 있다면 아래 그림 1과 같이 나타납니다.

진행 : 실행 → cmd  → java -version


그림 1. JDK가 설치 안되어있을 경우 메시지

설치가 안되어 있다면 아래의 링크로 이동하여 다운로드 받습니다.

http://www.oracle.com/technetwork/java/javase/downloads/index.html

 

Accept License Agreement를 클릭 해주셔야 합니다. 다음으로 자신의 운영체제에 맞는 버전을 다운로드 받으시기 바랍니다. 다운로드 속도는 500KB ~ 1MB 정도의 속도가 나옵니다. 2분가량 걸립니다.

다운로드가 모두 완료되었다면 설치를 진행합니다.

설치 완료 후 cmd창에서 java -version을 입력하면 버전이 나오게 됩니다. 

 

2. 안드로이드 SDK 다운로드하기(이클립스 포함)

안드로이드 SDK는 아래의 위치에서 다운로드 받을 수 있습니다.

http://developer.android.com/sdk/index.html

체크박스 체크하고 운영체제 bit 맞춰누르면 다운로드버튼이 활성화 됩니다. 대략 430MB로 300KB~500KB정도의 속도입니다. 20분 가량 걸렸네요.

다운로드 받은 파일은 zip 압축파일로 압축은 원하는 위치에 해제해 주시면 됩니다.
폴더 2개와 실행파일 1개가 있습니다.

 

3. 이클립스 실행하기

안드로이드 SDK를 압축해제하면 그 안에 이클립스가 포함되어 있습니다. eclipse폴더안의 eclipse.exe를 실행시켜 줍니다.


workspace는 프로젝트가 저장되는 경로로 원하는 경로를 지정해줍니다. 이어서 OK버튼을 클릭합니다.


구글에 통계자료 협력에 관한 내용입니다. Yes / No 개인 취향대로 선택 후 Finish를 해주세요.

 

다음은 디바이스 설정입니다. 앞으로의 설명은 가상장치로 진행하기에 가상장치 설정을 하겠습니다.

이클립스 → Window → Android Virtual Device Manager 로 이동합니다.

New를 선택합니다.

원하는 기기명, 기기, OS, RAM을 선택해주고 OK버튼을 클릭합니다. 

 

여기까지가 안드로이드 개발환경 구축하기 였습니다.

다음은 가상기기에서 Hello world를 출력해보겠습니다.

 

 

 

 

RamDisk 관련하여 환경 변수 TEMP와 TMP의 경로를 변경 후 발생한 것입니다.

관련 에러 메시지는

---------------------------------------------------------------------------------------------

오류 1 "GenerateResource" 작업에서 예기치 않은 오류가 발생했습니다.
System.TypeInitializationException: 'Microsoft.Build.Utilities.FileTracker'의 형식 이니셜라이저에서 예외를 Throw했습니다. ---> System.NullReferenceException: 개체 참조가 개체의 인스턴스로 설정되지 않았습니다.
   위치: Microsoft.Build.Utilities.FileTracker..cctor()
   --- 내부 예외 스택 추적의 끝 ---
   위치: Microsoft.Build.Utilities.FileTracker.EnsureFileTrackerOnPath(String rootPath)
   위치: Microsoft.Build.Tasks.GenerateResource.Execute()
   위치: Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
   위치: Microsoft.Build.BackEnd.TaskBuilder.ExecuteInstantiatedTask(ITaskExecutionHost taskExecutionHost, TaskLoggingContext taskLoggingContext, TaskHost taskHost, ItemBucket bucket, TaskExecutionMode howToExecuteTask, Boolean& taskResult) Test

---------------------------------------------------------------------------------------------

라고 나타납니다.

처음엔 뭔 소린가 했는데 구글링을 하다보니 나오네요...
관련 : http://stackoverflow.com/questions/3221565/microsoft-build-utilities-filetracker-threw-an-exception-error-happens-with-diff

아래처럼 따라하시면 됩니다.

0. RamDisk 또는 기타 사유로 환경 변수의 TEMP, TMP의 값을 변경했었을시 이 작업을 진행하세요.
1. 탐색기를 이용하여 %USERPROFILE%\AppData\Local\ 로 이동을 합니다.
2. Temp 폴더 삭제
3. 실행 -> cmd 실행시킨 후 아래 2줄을 입력합니다.
   cd %USERPROFILE%\AppData\Local\
   mklink /j TEMP "Z:\TEMP"
4. 탐색기를 이용하여 %systemroot% 로 이동을 합니다.
5. Temp 폴더 삭제
6. 실행 -> cmd 실행시킨 후 아래 2줄을 입력합니다.
   cd %USERPROFILE%\AppData\Local\
   mklink /j TEMP "Z:\TEMP"
7. 기존의 변경된 환경 변수의 TEMP, TMP의 값을 원상복귀합니다.
   TEMP, TMP 기본값 보기 : http://astinlen.tistory.com/11

추가적으로 RamDisk에서 부팅시바다 자동으로 TEMP 폴더가 생성되지 않는 RamDisk라면 Z:\TEMP를 Z:\로 하셔도 됩니다.

궁금한 점은 댓글로...

1. 컴파일

 프로그램 언어는 3개의 일반적인 방법에 의해서 구현될 수 있다. 한 극단적인 방법으로 프로그램은 컴퓨터에서 직접 실행될 수 있는 기계 언어로 번역될 수 있다. 이것을 컴파일러(Compiler) 구현이라 한다. 이 방법은 일단 번역 과정이 완료되면, 매우 빠르게 프로그램을 실행시킬 수 있다는 장점을 갖는다. C, COBOL, Ada와 같은 언어의 대부분 구현은 컴파일러에 의해서 이루어진다.

 컴파일러가 번역하는 언어를 원시 언어(source language)라고 한다. 컴파일 과정은 여러 단계로 이루어지는데, 이들 중 가장 중요한 단계들이 그림 1에 보여진다.

컴파일 과정


 어휘 분석기(lexical unit)는 원시 프로그램의 문자들을 어휘 단위로 모은다. 프로그램의 어휘 단위는 식별자, 특수어, 연산자, 구분자(punctuation)기호 등이다. 컴파일러에서 주석(comment)은 아무 소용이 없기 때문에, 어휘 분석기는 원시 프로그램에 포함된 주석을 무시한다.

 구문 분석기(syntax analyzer)는 어휘 분석기로부터 어휘 단위들을 가져오고, 이들을 사용하여 파스 트리(parse tree)라 불리는 계층적 구조를 생성한다. 이러한 파스 트리는 프로그램의 구문 구조를 표현한다. 대부분의 경우에 파스 트리 구조가 실제적으로 구성되지는 않고, 이 트리를 생성하는 데 필요한 정보가 생성되고 사용된다.

 중간 코드 생성기(intermediate code generator)는 다른 언어로 표현된 프로그램을 생성하는데, 이 프로그램은 원시 프로그램과 컴파일러의 최종 출력 프로그램(기계어 프로그램)의 중간 수준에 위치한다. 중간 언어는 때때로 어셈블리어와 매우 유사하며, 어떤 경우에는 실제로 어셈블리어이다. 다른 경우에 중간 코드는 어셈블리어 보다 약간 높은 수준에 있다. 의미 분석기(semantic analyzer)는 중간 코드 생성기의 필수적인 부분이다. 의미 분석기는 구문 분석 시에 탐지하는 것이 불가능한 것은 아닐지라도 타입 오류와 같은 어려운 오류를 검사한다.

 프로그램의 크기를 줄이거나 실행 속도를 보다 빠르게(또는 둘 다) 함으로써 프로그램을 향상시키는 최적화(optimization)는 보통 컴파일의 선택 사항이다. 사실, 어떠한 중요한 최적화도 수행할 수 없는 컴파일러도 있다. 이런 유형의 컴파일러는 번역된 프로그램의 실행 속도가 컴파일 속도보다 크게 중요하지 않은 상황에서 사용될 것이다. 이러한 상황의 예는 초급 프로그래머를 위한 컴퓨터 실습실이다. 대부분의 상업과 산업 현장에서는 실행 속도가 컴파일 속도보다 중요하고, 따라서 최적화를 일상적으로 수행하는 것이 보통 바람직하다. 많은 유형의 최적화가 기계 언어에서 수행하는 것이 어렵기 때문에, 대부분의 최적화는 중간 코드에서 이루어진다.

 코드 생성기(code generator)는 프로그램의 최적화된 중간 코드를 동등한 기계 언어 프로그램으로 변환한다.

 심볼 테이블은 컴파일 과정에서 데이터베이스로서 사용된다. 심볼 테이블의 주요 내용은 프로그램에서 사용자가 정의한 각 이름에 대한 타입과 속성 정보이다. 이러한 정보는 어휘 분석기와 구문 분석기에 의해서 심볼 테이블에 저장되고, 의미 분석기와 코드 생성기에 의해서 사용된다.

 위에서 설명하였듯이, 컴파일러가 생성한 기계 언어가 직접 하드웨어에서 실행 될 수 있을지라도, 기계 코드는 거의 항상 다른 코드와 함께 실행되어야 한다. 또한, 대부분의 사용자 프로그램은 운영체제로부터 프로그램을 요구한다. 이러한 프로그램 중에서 가장 일반적인 것은 입력과 출력을 위한 프로그램이다. 컴파일러는 사용자 프로그램에서 요구할 때 필요한 시스템 프로그램에 대한 호출을 생성한다. 컴파일러가 생성한 기계 언어 프로그램이 실행될 수 있기 전에, 요구된 시스템 프로그램이 운영체제로부터 찾아져서 사용자 프로그램에 연결되어야 한다. 링킹 연산(linking operation)은 사용자 프로그램에서 요구한 시스템 프로그램의 호출 위치에 그 시스템 프로그램의 시작 주소를 저장함으로써 사용자 프로그램을 시스템 프로그램에 연결한다. 사용자 코드와 시스템 코드는 함께 적재 모듈(load module), 또는 실행 가능 이미지(executable image) 불린다. 시스템 프로그램들을 수집하고 이들을 사용자 프로그램에 연결하는 과정을 링킹(linking)과 적재(loading)라고 부르며, 또는 때때로 단지 링킹이라고 부른다. 이 과정은 링커(linker)라고 부르는 시스템 프로그램에 의해서 수행된다.

 시스템 프로그램 외에도 사용자 프로그램은 보통 라이브러리에 존재하는 이미 컴파일된 다른 사용자 프로그램에 링킹되어야 한다. 따라서 링커는 주어진 프로그램을 시스템 프로그램에 링킹할 뿐만 아니라, 다른 사용자 프로그램에도 링킹할 수 있다.

 폰 노이만 구조 컴퓨터에서 기계 코드 프로그램의 실행은 인출-실행 사이클(fetch-execution cycle)이라 불리는 과정으로 이루어진다. 프로그램은 기억장소에 저장되어 있지만 CPU에서 실행된다. 실행될 각 명령어는 기억장소에서 프로세서로 옮겨져야 한다. 다음에 실행할 명령어의 주소는 프로그램 계수기(program counter)라 불리는 레지스터에 유지되어 있다. 인출-실행 사이클은 다음 알고리즘으로 간단히 기술될 수 있다.

          프로그램 계수기를 초기화한다.
          repeat forever
                    프로그램 계수기가 가리키는 명령어를 인출한다.
                    다음 명령어를 가리키기 위해 프로그램 계수기를 증가시킨다.
                    명령어를 해석한다.
                    명령어를 실행한다.
          end repeat

 위 과정의 명령어 해석 단계에서는 명령어에 어떤 연산이 명세되어 있는지를 결정하기 위해서 명령어를 조사한다. 실제 컴퓨터에서 stop 명령어가 거의 실행되지 않을지라도, 프로그램 실행은 stop 명령어를 만나면 종료된다. 제어는 사용자 프로그램을 실행시키기 위해서 운영체제로부터 그 사용자 프로그램에 전달되고, 사용자 프로그램의 실행이 완료되면 다시 운영체제로 전달된다. 주어진 시간에 한 개 이상의 사용자 프로그램이 기억장소에 존재할 수 있는 컴퓨터 시스템에서 이러한 과정은 훨씬 더 복잡해진다.

 명령어는 보통 실행을 위해서 프로세서에 옮기는 데 걸리는 시간보다 더 빠르게 실행될 수 있기 때문에 컴퓨터의 기억장소와 프로세서를 연결하는 속도는 보통 컴퓨터의 속도를 결정한다. 이러한 연결을 폰 노이만 병목(von Neumann bottleneck)이라 한다. 이것은 폰 노이만 구조 컴퓨터의 속도를 제한하는 주요 요소이다. 폰 노이만 병목은 병렬 컴퓨터의 연구와 개발을 위한 주요 동기중의 하나였다.

2. 순수 해석

 순수 해석(pure interpretation)은 구현 방법의 스텍트럼 상에서(컴파일과는 다른) 정반대의 위치에 속한다. 이 방법을 사용하여 프로그램은 어떠한 번역 과정 없이 인터프리터(interpreter)라 불리는 다른 프로그램에 의해서 해석(interpret)될 수 있다. 인터프리터 프로그램은 인출-실행 사이클이 기계 명령어가 아닌 고급 언어 프로그램을 다루는 기계의 소프트웨어 모의실험(simulation)으로서 동작한다. 이러한 소프트웨어 모의실험은 확실히 그 언어에 대한 가상 기계를 제공한다.

 순수 해석은 많은 원시 프로그램 수준의 디버깅 연산을 쉽게 구현할 수 있는 장점을 가진다. 이것은 모든 실행 시간 오류 메시지가 원시 수준 단위를 참조할 수 있기 때문이다. 예를 들면, 배열 인덱스가 범위를 벗어낫다는 것이 발견되면, 어류메시지는 원시 프로그램의 행과 배열 이름을 쉽게 나타낼 수 있다. 반면에, 이러한 방법은 실행 시간이 컴파일된 시스템의 경우보다 10배 내지 100배 정도 느리다는 심각한 단점을 갖는다. 이렇게 실행 속도가 느린 주요 요인은 기계 언어 명령어보다 훨씬 더 복잡한 고급 언어 문장을 해석한다는 데 있다(동일한 의미를 갖는 기계 코드의 명령어보다 문장수가 더 적을지라도). 더욱이, 문장이 반복 실행되는 회수와는 무관하게, 그 문장은 매번 해석되어야 한다. 그러므로 프로세서와 기억장소간의 연결보다는 문장 해석이 순수 인터프리터의 병목이다.

 순수 인터프리터의 다른 단점은 보통 더 많은 기억공간을 요구한다는 데 있다. 원시 프로그램 외에도 심볼 테이블이 해석하는 동안에 존재해야 한다. 더욱이, 원시 프로그램은 최소의 크기로 제공된 형태보다는 접근과 수정이 용이하도록 설계된 형태로 저장될 수 있다.

 1960년대의 단순한 초기 언어(APL, SNOBOL, LISP)들이 순수 해석으로 구현되었지만, 1980년대에는 이 방법이 고급 언어에 대해서 거의 사용되지 않았다. 그러나 최근에 순수 해석이 현재 널리 사용되고 있는 JavaScript와 PHP와 같은 웹 스크립트 언어에 의해서 다시 사용되고 있다.

 순수 인터프리터의 과정이 그림 2에서 보여진다.

순수 인터프리터의 과정


3. 혼합형 구현 시스템

 어떤 언어 구현 시스템은 컴파일러와 순수 인터프리터의 절충 형태이다. 즉, 이 시스템은 고급 언어 프로그램을 쉽게 해석하기 위해 설계된 중간 언어로 변역한다. 이 방법은 원시 언어 문장이 단지 한번만 해석되기 때문에 순수 해석보다 더 빠르다. 이러한 구현을 혼합형 구현 시스템(hybrid implementation system)이라 한다.

 혼합형 구현 시스템에서 사용된 처리 과정이 그림 3에 보여진다. 중간 언어 코드를 기계 코드로 번역하는 대신에 혼합형 구현 시스템은 그 중간 코드를 단순히 해석한다.

혼합형 구현 시스템의 과정

 Perl은 혼합형 시스템으로 구현되었다. 이 언어는 순수 해석 언어 sh와 awk로부터 발전되었으나, 해석 단계 전에 오류를 탐지하고 인터프리터를 단순하게 하기위해 부분적으로 번역된다.

 Java의 초기 구현은 모두 혼합 형태였다. 바이트 코드라 불리는 그 중간 코드 형태는 바이트 코드 인터프리터와 관련된 실행 시간 시스템을 가지고 있는 기계에 이식성을 제공한다. 이러한 바이트 코드 인터프리터와 관련된 실행 시간 시스템을 함께 Java 가상 기계(Java Virtual Machine)라 한다. 현재는 더 빠른실행을 위해서 Java 바이트 코드를 기계 코드로 번역하는 시스템이 존재한다. 그러나 Java애플릿(applet)은 항상 웹서버로부터 바이트 코드의 형태로 다운로드(download) 된다.

 때때로 구현자는 한 언어에 대해서 컴파일 구현과 인터프리터 구현 모두를 제공할 수 있다. 이러한 경우에 인터프리터는 프로그램을 개발하고 디버깅하는데 사용된다. 다음에, (상대적으로) 버그가 없는 상태에 이르면, 프로그램은 실행 속도를 향상시키기 위해서 컴파일 된다.