GIT 은 프로그램을 여러명이 동시에 개발할 때 소스코드를 편리하게 관리/운영 할 수 있게 도와주는 버전관리 툴입니다.

 

SVN 과 함께 양대산맥처럼 사용되고 있으며, 개인적 경험으로는 GIT 을 더 오랜기간 사용하고 있습니다.

 

처음 이용할 때에는 개념적으로 어렵게 느껴질 수도 있지만 익숙해질수록 그 유용함에 절로 고개가 끄덕여질 만큼 고마운 개발지원 도구 입니다.

 

 

오늘은 GIT 을 사용하는 시작점으로 윈도우에서 GIT 을 설치하는 방법에 대해 소개해 드리도록 하겠습니다.

 

 

 

1. GIT 다운로드

 

아래 링크를 통해서 GIT 홈페이지를 방문하시면 무료로 다운 받을 수 있습니다.

http://www.git-scm.com/

 

 

Downloads for Windows 버튼을 클릭합니다.

 

 

 

브라우저 아래쪽으로 바로 실행 or 저장을 묻는 화면이 나타납니다.

실행을 선택합니다.  

 

 

 

 

 

2. GIT 설치

 

 

Next 버튼을 클릭하여 설치를 시작합니다.

 

 

 

GIT 에 대한 라이센스를 공지하는 부분입니다.

Next 버튼을 클릭합니다.

 

 

 

설치될 위치를 확인하고 Next 버튼을 클릭합니다.

 

 

 

Advanced context menu (git-cheetah plugin) 이 체크되어 있는지 확인하고, Next 버튼을 클릭합니다.

(이 옵션은 마우스 우클릭시 나타나는 컨텍스트 메뉴에 GIT 을 추가할 것인지 묻는 부분입니다.)

 

 

 

GIT 의 shortcut 생성 위치를 묻는 부분으로 Next 버튼을 클릭합니다.

 

 

 

GIT 을 사용하기 위한 환경을 설정하는 부분입니다.

 

(1) Use Git from Git Bash only

해당 프로그램에서 제공해주는 Git Bash 에서만 Git 을 사용할 수 있도록 설치합니다.

 

(2) Use Git from the Windows Command Prompt

윈도우에 명령 프롬프트에서도 Git 을 사용할 수 있도록 설치합니다.

 

(3) Use Git and optional Unix tools from the Windows Command Prompt

명령 프롬프트에서 몇가지 유닉스 도구와 Git 을 사용할 수 있도록 설치합니다.

(윈도우와 유닉스가 같은 명령을 가지고 있다면(예를 들어 find, sort) 해당 명령어의 경로를 덮어써서 기존과 다르게 동작할 수도 있으므로 주의해야 합니다.)

 

2번째 옵션인 Use Git from the Windows Command Prompt 를 체크하고

Next 버튼을 클릭합니다.

 

 

 

행 변환과 관련된 내용으로 첫번째 옵션인 Checkout Windows-style, commit Unix-style line endings 를 체크하고 Next 버튼을 클릭합니다.

 

 

 

옵션 설정이 모두 끝나고 설치가 진행중입니다.

 

 

 

 

드디어 설치가 완료되었습니다.

Finish 버튼을 클릭합니다.

 

 

 

 

3. GIT 실행

 

 

 

바탕화면에서 마우스 우클릭하면 설치할때 설정한 옵션에 따라 GIT 과 관련된 3가지 메뉴가 추가되어 있는 걸 확인할 수 있습니다.

 

GIT 은 2가지 옵션 형태로 사용할 수 있는데요.

 

 

 

 

Git Gui 항목을 클릭하면 다음과 같은 다이얼로그가 나타나며

UI 화면을 통해서 기능들을 사용할 수 있는 그래픽 인터페이스가 제공됩니다.

 

 

 

 

 

Git Bash 항목을 클릭하면 명령어를 입력할 수 있는 창(커맨드라인 제공)이 나타나는 것을 확인할 수 있습니다.

Git Bash 를 이용하여 작업한다면 이후에 유닉스 등에서도 동일한 방법으로 사용하실 수 있기 때문에

Git Cui 보다는 이 옵션에 익숙해 지시길 추천드립니다.

 

 

 

 

GIT 설치가 정상적으로 이루어졌는지 간단하게 알아보기 위해서 version 을 확인해 보았습니다.

 

설치할 때 설정한 옵션에 따라 명령 프롬프트에서도 (Git Bash 와) 동일한 작업이 가능합니다.

 

 

'IT > GIT' 카테고리의 다른 글

이클립스에 GIT 설치하기 (EGit 플러그인)  (0) 2015.04.13

Posted by maze1008
,

글쓰기를 선택하면 상단에 카테고리 선택과 타이틀을 입력하는 부분이 나타납니다.

 

 

 

카테고리를 선택(Java) 하고, 타이틀도 깔끔하게 입력했습니다. ([Java] 자바 버전 확인)

 

 

 

 

이때 우측의 기본 설정 > 절대주소를 보면

타이틀 기반으로 Java-자바-버전-확 이라는 문자 형태의 티스토리 주소가 자동으로 생성되어져 있습니다.

 

 

 

글을 모두 작성하고 저장 버튼을 클릭하면

 

 

기본 티스토리 주소/entry/절대 주소 형태의 글 주소가 완성되어 나타납니다.

그냥 보기엔 깔끔하고 괜찮아 보이지만 작성하는 글의 제목이 한글로 이루어져 있기 때문에

아주 길어진 깨진 주소를 만나게 되는 순간이 있습니다.

 

 

 

이렇게 말이죠!

 

 

 

그렇다면 문자 주소를 RSS 에 나타나는 것처럼 숫자 주소로 변경하는 방법 은 무엇일까요?

 

 

관리자 메뉴로 들어갑니다.

좌측 사이드 > 환경설정 > 기본 정보를 클릭합니다.

 

 

 

주소설정 > 개별글 주소 옆에 숫자를 체크 하고 저장 버튼을 클릭합니다. (기본은 문자 입니다.)

 

아주 쉽고 간단하죠?

이제부터는 작성되는 글(포스트)들이 순서대로 1씩 증가하면서 숫자로된 주소를 부여받게 됩니다. 

(기존에 작성하셨던 글들도 모두 정상적으로 링크되니 걱정말고 변경해 보세요!)

 

Posted by maze1008
,

구글 애드센스 가입을 성공적으로 마치고 블로그에 광고도 착착착! 삽입했습니다.

 

그리고 나서 관리는 스마트 폰에 티스토리 앱을 설치해서 주로 하고 있었습니다.

편리하게 사용할 수 있어서 더할나위 없이 만족스러웠는데요.

어느날 문득 제 글을 클릭해 보니 열심히 추가했던 광고가 하나도 보이지 않았습니다!!

 

 

티스토리 앱의 아이콘입니다.

 

 

 

 좌측 상단에 메뉴를 터치하고 로그인을 진행합니다.

 

 

 

통계 기능을 통해서 주로 관리를 해왔는데요.

글목록 기능을 선택하면 블로그에 작성된 글을 확인할 수 있습니다.

글목록을 터치 해주세요.

 

 

 

열심히 만들었던 애드센스 광고가 하나도 보이지 않습니다.

PC 에서는 상단 좌/우에 하나씩 배치되어 나오는데 말이죠.

 

 

이리저리 방법을 찾아보니 모바일용 구글 애드센스 광고는 다른 방법으로 적용이 필요했습니다.

그래서 이번에는 저처럼 모바일 광고를 놓치고 계시는 분들을 위해서

애드센스 광고를 모바일 플러그인을 사용하여 추가하는 방법에 대해 소개해 드리도록 하겠습니다.

 

 

 

1. 애드센스 광고 만들기

 

아래의 링크를 통해서 애드센스 페이지를 방문한 후 로그인을 진행합니다.

https://www.google.com/adsense/

 

 

 

상단에 내 광고 메뉴 > 새 광고 단위 버튼을 클릭합니다.

 

 

 

 

광고크기 > 게재 : 가로배너 를 선택하시면 320 X 100 과 320 X 50 크기의 모바일 배너가 있습니다.

모바일에서 주로 사용되는 광고 크기 입니다.

 

 

 

이름 항목에 광고의 이름을 입력합니다. (모바일-상단 이라고 입력했습니다.)

 

광고 크기를 선택합니다.

저는 권장크기인 320 X 100 사이즈를 선택했습니다.

 

저장 및 코드 생성 버튼을 클릭합니다.

 

 

 

광고가 성공적으로 생성되었습니다.

 

다이얼로그 중간에 광고 코드가 표시되는 데 이 부분을 복사해서 자신의 블로그에 삽입하면 광고가 나타나게 되는 것입니다. 광고코드를 복사해 주시기 바랍니다. 

(복사해서 메모장 등에 붙여 넣고 바로 사용할 수 있도록 준비해 주십시요.)

 

 

 

새로 만든 모바일-상단 광고가 리스트에 나타나게 됩니다.

 

 

 

2. 티스토리 블로그에 광고 삽입하기

 

 

관리자 메뉴로 들어갑니다.

좌측 사이드 > 플러그인 > 플로그인 설정을 클릭합니다.

 

 

 

Google AdSense (모바일용) 을 클릭합니다.

 

 

 

플러그인 설정 방법이 친절하게 설명되어져 나타납니다.

설정에서 원하는 광고 형태를 선택하고, 광고1 에 광고 생성시 복사해 두었던 광고 코드를 넣어주시기 바랍니다. 확인 버튼을 클릭합니다.

 

 

 

Google AdSense (모바일) 항목에 촤측이 체크되어 나타나면 애드센스 삽입이 모두 완료된 것입니다.

이제 10여분의 시간이 지난후에 다시 티스토리 앱을 실행해서 글목록을 확인합니다.

 

 

 

글 상단에 광고가 추가 된게 보이시나요?

 

모바일에서도 많은 분들에게 도움이 되는 블로그가 되었으면 좋겠습니다.

 

Posted by maze1008
,

애드센스에 가입하고 블로그에 광고를 추가했는데, 약어로 되어 있는 광고 용어들이 자꾸만 헷갈렸습니다.

 

아하~ 그렇구나! 이해를 하고 넘어가도 다음에 다시 보면 또 헷갈린하고 할까요?

 

블로그 수익에 시작이 애드센스라면 필수 요소는 아마 용어에 대한 이해일 것입니다.

 

 

그래서 이번에는 간단하지만 자꾸 잊어버리게 되는 온라인 광고 용어에 대해서 정리해 보도록 하겠습니다.

 

 

1. 애드센스 광고용어

 

 

(1) 페이지뷰

사용자가 애드센스 광고가 포함된 글을 조회한 횟수 입니다.

글의 포함된 광고의 수와는 상관없이 글을 1 개 볼때마다 1회로 기록됩니다.

방문자가 블로그에서 3개의 글을 보개 된다면 3회가 추가 될 것이니 방문자의 수와는 다를 수 있습니다.

 

(2) 클릭수

사용자가 광고를 실질적으로 클릭한 횟수 입니다.

확률적으로 페이지뷰의 숫자가 높을 수록 클릭수도 높다고 알려져 있습니다.

(링크 단위에서는 링크 클릭 후에 웹페이지에 표시되는 광고를 클릭한 횟수를 말합니다. )

 

(3) CTR (Click Through Ratio, 페이지 클릭률)

몇 개의 페이지가 노출되었을 때 클릭이 발생하는지를 나타냅니다.

클릭수를 페이지뷰로 나눈 값으로 표시됩니다. (CRT = 클릭수 / 페이지뷰)

예를 들어 페이지뷰 : 100, 클릭수 : 1 => CTR : 1 %

 

(4) CPC (Pay  Per  Click, 클릭당 비용)

사용자가 광고를 클릭하여 웹페이지를 방문할 때 클릭 1회당 발생하는 수익 입니다.

광고당 비용이 다르기 때문에 일반화하기 위해서 총 수익을 발생한 클릭수로 나눈 값으로 표시됩니다.

(CPC = 총 수익 / 클릭수)

예를 들어 1달러 광고 1회 클릭, 2달러 광고 1회 클릭시

총 수익 : 3달러, 클릭수 : 2회 => CPC : 1.5 달러 

 

(5) RPM (Revenue Per Mille, 페이지 RPM)

1000회 노출(페이지뷰)이 발생했을 때 예상되는 수입율입니다.

(RPM = (예상 수입 / 페이지뷰) * 1000 )

예를 들어 페이지뷰 : 25, 예상 수입 : 0.15 달러 => RPM : 6 달러

  

 

 

2. 기타 광고 용어

 

 

(1) CPM (Cost Per Mile)

1000회 노출당 확정 가격으로 월정액제 광고를 의미합니다.

광고를 노출하는 것만으로도 수익을 얻을 수 있습니다.

 

(2) CPA (Cost Per Action)

사용자가 광고를 클릭하여 웹페이지를 방문한 후에 회원가입, 이벤트 참여, 구매 등의 일정한 동작을 할 경우 발생하는 수익입니다. CPM(노출),CPC(클릭) 을 넘어 일정한 동작을 해야만 수익이 발생하기 때문에 가장 높은 광고 금액을 얻을 수 있습니다.

 

Posted by maze1008
,

자바(Java) 에 대해 공부하면서 다음과 같은 말을 많이 들어보았을 것입니다.

 

깊은 복사(deep copy) 와 얕은 복사(shallow copy)

참조 복사(call by reference) 와 값 복사(call by value)

 

값을 다른 곳에 복사하여 사용할 때, 복사가 이루어지는 방법에 따라 동작에 많은 영향을 미치게 됩니다.

지금부터 ArrayList 를 사용하여 두 가지 방법이 어떤 차이점을 가지고 있는지 알아보도록 하겠습니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import java.util.ArrayList;
 
public class CopyTest {
    static ArrayList<String> source = new ArrayList<String>();
    static ArrayList<String> destination = new ArrayList<String>();
    
    public static void initArrayList() {
        if (null != source) {
            source.clear();
            source.add("apple");
            source.add("banana");
            source.add("cherry");
        }
 
        if (null != destination) {
            destination.clear();
        }
    }
    
    public static void printArrayList() {
        System.out.println("====== source result ======");
        for (int i = 0; i < source.size(); i++) {
            System.out.println("source ["+i+"] : " +source.get(i));
        }
 
        System.out.println("====== destination result ======");
        for (int i = 0; i < destination.size(); i++) {
            System.out.println("destination ["+i+"] : " +destination.get(i));
        }
    }
 
    public static void main(String[] args) {
        initArrayList();
 
        // TODO : operation
        
        printArrayList();
    }
}
 
cs

 

 

코드를 간단히 살펴보면,  2 개의 ArrayList 가 선언되어 있고(source, destination)

main() 메소드의 // TODO : operation  위치에서 다음과 같은 2가지 동작을 수행한 후

각각의 ArrayList 가 가지고 있는 값을 모두 출력하게 됩니다. 

1. source 에 있는 내용을 destination 에 복사

2. destination 에 항목을 1개 추가

 

 

동일한 동작을 얕은 복사와 깊은 복사로 적용해 보았습니다.

1. 얕은 복사(shallow copy)      

destination = source;

destination.add("kiwi");

  

<결과>

destination 에만 추가한 kiwi 가 source 에도 추가되어 있음을 확인할 수 있습니다.

shallow copy 는 원본과 복사본 둘 중 한쪽의 수정이 양쪽에 모두 영향을 미치게 됩니다.

 

====== source result ======
source [0] : apple
source [1] : banana
source [2] : cherry
source [3] : kiwi 
====== destination result ======
destination [0] : apple
destination [1] : banana
destination [2] : cherry
destination [3] : kiwi

 

2. 깊은 복사(deep copy)      

destination.addAll(source) ; // 또는 destination =(ArrayList<String>)source.clone();

destination.add("kiwi");

  

<결과>

destination 에만 추가한 kiwi 가 source 에는 존재하지 않음을 확인할 수 있습니다.

deep copy 는 원본과 복사본 둘 중 한쪽의 수정이 다른 한쪽에 영향을 미치지 않습니다.

주석으로 표기한 방법으로도 같은 효과를 얻을 수 있습니다.

 

====== source result ======
source [0] : apple
source [1] : banana
source [2] : cherry
====== destination result ======
destination [0] : apple
destination [1] : banana
destination [2] : cherry
destination [3] : kiwi

 

 

 

그런데 여기서 추가적으로 1가지 더 살펴 보아야 하는 부분이 있습니다.

ArrayList  의 Item 으로 객체가(Object) 선언되어 있다면 깊은 복사는 어떻게 동작하게 될까요?

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import java.util.ArrayList;
 
class Fruit {
    private String name;
    private int count;
 
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getCount() {
        return count;
    }
    public void setCount(int count) {
        this.count = count;
    }
}
 
public class CopyTest {
    static ArrayList<Fruit> source = new ArrayList<Fruit>();
    static ArrayList<Fruit> destination = new ArrayList<Fruit>();
    
    public static void initArrayList() {
        if (null != source) {
            source.clear();
            
            String[] names = new String[] {"apple""banana""cherry"};
            for (int i = 0; i < names.length; i++) {
                Fruit f = new Fruit();
                f.setName(names[i]);
                f.setCount(i + 1);
                source.add(f);
            }
        }
 
        if (null != destination) {
            destination.clear();
        }
    }
    
    public static void printArrayList() {
        System.out.println("====== source result ======");
        for (int i = 0; i < source.size(); i++) {
            System.out.println("source["+i+"] name:"+source.get(i).getName());
            System.out.println("source["+i+"] count:"+source.get(i).getCount());
        }
 
        System.out.println("====== destination result ======");
        for (int i = 0; i < destination.size(); i++) {
            System.out.println("destination["+i+"] name:"+destination.get(i).getName());
            System.out.println("destination["+i+"] count:"+destination.get(i).getCount());
        }
    }
 
    public static void main(String[] args) {
        initArrayList();
        
         // TODO : operation
 
        printArrayList();
    }
}
cs

 

코드를 간단히 살펴보면, name 과 count 를 속성으로 갖고 있는 Fruit 클래스가

2 개의 ArrayList 의(source, destination) Item 으로 선언되어 있습니다.

마찬가지로 main() 메소드의 // TODO : operation  위치에서 다음과 같은 2가지 동작을 수행한 후

각각의 ArrayList 가 가지고 있는 값을 모두 출력하게 됩니다. 

1. source 에 있는 내용을 destination 에 복사

2. destination 에 항목을 1개 추가

 

 

동일한 동작을 얕은 복사와 깊은 복사로 적용해 보았습니다.

1. 얕은 복사(shallow copy)      

destination = source;

Fruit f = new Fruit();

f.setName("kiwi");

f.setCount(4);

destination.add(f);

  

<결과>

destination 에만 추가한 kiwi 가 source 에도 추가되어 있음을 확인할 수 있습니다.

shallow copy 는 원본과 복사본 둘 중 한쪽의 수정이 양쪽에 모두 영향을 미치게 됩니다.

 

====== source result ======
source [0] name : apple
source [0] count : 1
source [1] name : banana
source [1] count : 2
source [2] name : cherry
source [2] count : 3
source [3] name : kiwi
source [3] count : 4
====== destination result ======
destination [0] name : apple
destination [0] count : 1
destination [1] name : banana
destination [1] count : 2
destination [2] name : cherry
destination [2] count : 3
destination [3] name : kiwi
destination [3] count : 4

 

2. 깊은 복사(deep copy)     

destination.addAll(source) ; // 또는 destination =(ArrayList<Fruit>)source.clone();

Fruit f = new Fruit();

f.setName("kiwi");

f.setCount(4);

destination.add(f);

  

<결과>

destination 에만 추가한 kiwi 가 source 에는 존재하지 않음을 확인할 수 있습니다.

deep copy 는 원본과 복사본 둘 중 한쪽의 수정이 다른 한쪽에 영향을 미치지 않습니다.

주석으로 표기한 방법으로도 같은 효과를 얻을 수 있습니다.

 

====== source result ======
source [0] name : apple
source [0] count : 1
source [1] name : banana
source [1] count : 2
source [2] name : cherry
source [2] count : 3
====== destination result ======
destination [0] name : apple
destination [0] count : 1
destination [1] name : banana
destination [1] count : 2
destination [2] name : cherry
destination [2] count : 3
destination [3] name : kiwi
destination [3] count : 4

 

 

이것만으로 정말 제대로 된 Fruit 객체에 대한 깊은 복사가 이루어 진 것일까요?

source 의 apple 객체의 count 를 1 에서 10 으로 값을 바꾼다면 destination 에는 영향이 없을까요?

다시 테스트를 진행해 보도록 하겠습니다.

 

* 객체의 깊은 복사(deep copy)

destination.addAll(source) ; // 또는 destination =(ArrayList<Fruit>)source.clone();

Fruit f = destination.get(0);    // "apple"

f.setCount(10);                    // change : 1 -> 10

  

<결과>

분명히 깊은 복사를 진행했는데도 source 와 destination 의 apple 의 count 가 모두 10으로 변경된 것을 확인할 수 있습니다. 결국 두 ArrayList 의 포함된 Fruit 은 같은 객체라는 의미입니다.

 

====== source result ======
source [0] name : apple
source [0] count : 10
source [1] name : banana
source [1] count : 2
source [2] name : cherry
source [2] count : 3
====== destination result ======
destination [0] name : apple
destination [0] count : 10
destination [1] name : banana
destination [1] count : 2
destination [2] name : cherry
destination [2] count : 3

 

이 문제를 해결하기 위해서는 결국 다음과 같은 방법이 필요합니다.

 

* 객체의 깊은 복사(deep copy)

1. Fruit 클래스의 복사 생성자 추가

public Fruit() { }      // 기본 생성자

public Fruit(Fruit f) { // 복사 생성자

   this.name = f.getName();
   this.count = f.getCount();

 }

 

2. main() 메소드에서 객체에 대한 깊은 복사(deep copy) 수행

for (int i = 0; i < source.size(); i++) {
        destination.add(new Fruit(source.get(i)));
}
Fruit f2 = destination.get(0);    // "apple"
f2.setCount(10);                    // change : 1 -> 10

  

<결과>

원본과 복사본 둘 중 한쪽의 수정이 다른 한쪽에 영향을 미치지 않습니다.

이제서야 완전히 독립된 ArrayList 객체 복사가 완료되었습니다.

 

====== source result ======
source [0] name : apple
source [0] count : 1
source [1] name : banana
source [1] count : 2
source [2] name : cherry
source [2] count : 3
====== destination result ======
destination [0] name : apple
destination [0] count : 10
destination [1] name : banana
destination [1] count : 2
destination [2] name : cherry
destination [2] count : 3

 

Posted by maze1008
,

새로운 모든 언어/플랫폼을 접할 때 개발 환경을 설정하고

 

가장 먼저 하게 되는 작업이 "Hello World 출력하기" 일 것입니다.

 

개발 환경 설정 + "Hello World 출력하기" 를 모두 마쳤다면 그 언어의 대해 50% 이상의 벽을 넘었다는 의미처럼 느껴질 정도로 말입니다.

 

자! 그럼 이제 새로운 프로젝트를 생성해서 Hello World 를 출력해 보도록 하겠습니다.

 

혹시 안드로이드 개발환경이 아직 완료되지 않으셨다면 아래 포스팅을 참고하여 주시기 바랍니다.

안드로이드 개발환경 구축하기

 

 

 

1. 프로젝트 생성하기

 

 

이클립스를 실행합니다.

File 메뉴 > New > Project 를 선택합니다.

 

 

 

새로운 프로젝트를 생성하기 위해 다이얼로그가 나타나는 것을 확인할 수 있습니다.

Android 폴더 > Android Application Project 선택 > Next 버튼을 클릭합니다.

 

 

 

생성하고자 하는 Application / Project / Package Name 을 순서대로 입력하고

Minimum Required SDK(지원하고자 하는 최소 버전), Target SDK(타켓 버전), Complie With(프로젝트 컴파일하여 빌드할 때 사용할 버전)을 순서대로 선택합니다.

 

현재 Hello world 프로젝트를 간단하게 실행하기 위해서는 Application Name 만 입력해 주셔도 됩니다.

Next 버튼을 클릭합니다.

 

 

다음에 나타나는 화면들에서는 Next or Finish 버튼을 클릭하여 프로젝트 생성을 완료합니다.

(프로젝트에 대한 상세한 설정을 위해 필요한 부분이지만 대부분 수정을 하지 않습니다.)

 

 

 

 

 

 

 

다이얼로그가 사라지고 좌측 화면에 Application Name 으로 입력했던 HelloWorld 프로젝트가 생성된 것을 확인할 수 있습니다.

 

 

 

2. 프로젝트 실행하기

 

프로젝트(HelloWorld 어플리케이션) 을 실행하기 위해서 AVD 를 생성 및 실행합니다.

안드로이드 AVD 생성 및 옵션 조정

 

 

 

좌측 화면에서 HelloWorld 프로젝트를 선택하고

상단의 툴바에 있는 시작 버튼 > Run As > Android Application 을 선택합니다.

 

 

 

미리 실행해 놓았던 AVD(에뮬레이터)에 HelloWorld 어플리케이션이 실행되어 화면에 나타납니다.

 

실제 스마트폰에 연결해서 테스트 하고 싶다면 AVD(에뮬레이터) 대신 스마트폰을 PC 에 연결하시면 됩니다.

PC 와 스마트폰 연결하기 (ADB 사용)

 

 

만약 PC 에 스마트폰과 AVD(에뮬레이터) 등이 동시에 연결되어 있다면

어떤 디바이스에서 HelloWorld 어플리케이션을 실행할 것인지 선택하기 위한 다이얼로그가 나타나며 (Android Device Chooser) 그곳에서 원하는 디바이스를 선택하시면 됩니다.

 

Posted by maze1008
,

자바에서는 Random 클래스와 Math 클래스를 사용하여 편리하게 random value 를 생성할 수 있습니다.

자바 랜덤함수(Java Random)

 

 

그러나 랜덤 문자열(random string) 을 만들기 위해서는 추가적으로 간단한 구현이 필요합니다.

지금부터는 random string 을 만들기 위한 방법에 대해 설명하도록 하겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.util.Random;
 
public class RandomString {
    private static final char[] chars;
    static {
        StringBuilder buffer = new StringBuilder();
        for (char ch = '0'; ch <= '9'; ++ch)
            buffer.append(ch);
        for (char ch = 'a'; ch <= 'z'; ++ch)
            buffer.append(ch);
        for (char ch = 'A'; ch <= 'Z'; ++ch)
            buffer.append(ch);
        chars = buffer.toString().toCharArray();
    }
 
    public static String random(int length) {
        if (length < 1)
            throw new IllegalArgumentException("length < 1: " + length);
 
        StringBuilder randomString = new StringBuilder();
        Random random = new Random();
        
        for (int i = 0; i < length; i++) {
            randomString.append(chars[random.nextInt(chars.length)]);
        }
        return randomString.toString();
    }
 
    public static void main(String[] args) {
        System.out.println(random(10));
    }
}
cs

 

위의 random() 메소드는 글자의 길이(length) 를 파라미터로 입력 받아

원하는 크기의 random string 생성하고 있습니다.

 

chars 배열을 통해 원하는 문자(숫자, 소문자, 소문자)들을 기초로 하여

Random 클래스의 nextInt() 메소드에서 발생시키는 위치의 배열 값을 차곡차곡 쌓아

지정된 길이 만큼의 string 을 생성해서 반환합니다.

 

이외에도 "~!@#$%^&*()_+{}|\\\"`;:'<>?,./=-[]" 와 같은 특수 기호들을 포함할 수도 있습니다.

 

<출력>

3ifL5KImXd

 

 

추가적으로 stackoverflow 를 통해서 더 다양한 방법을 확인 할 수 있습니다.

 

 

Posted by maze1008
,

자바 랜덤함수를 사용하는 방법은 2가지가 있습니다.

 

Random 클래스와 Math 클래스를 각각 사용해서 random value 를 생성하는 방법에 대해 설명 드리겠습니다.

 

 

1. Java.util.Random

 

Random 클래스의 객체를 생성하면 다음과 같이 다양한 메소드를 사용하여 원하는 타입의 random value 를 생성할 수 있습니다.

 

그 중에서도 가장 많이 사용되는 nextInt() 메소드는 파라미터를 사용해서

원하는 범위내의 양수 값을 (범위 : 0 ~ 파라미터-1) 가져올 수 있습니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.Random;
 
public class RandomTest {
    public static void main(String[] args) {
        Random random = new Random();
        
        System.out.println(random.nextBoolean());   // true or false
        System.out.println(random.nextFloat());     // range : 0.0f ~ 1.0f(exclusive)
        System.out.println(random.nextInt());       // all 2^32 possible int values 
        System.out.println(random.nextInt(100));    // range : 0 ~ 99
    }
}
 
cs

 

 

<결과>

false
0.2699461
2087110484
73

 

 

 

2. Java.util.Math

 

Math 클래스는 수학적 연산과 관련된 메소드들을 제공하는 클래스로

random() 메소드를 사용하여 0.0 <= double value < 1.0  의 값을 생성할 수 있습니다.

 

random() 메소드가 double 타입을 리턴하기 때문에 타입 캐스팅(int)를 사용해서 정수형으로 변환하여 사용할 수 있으며, (int)(Math.random() * 최대값) + 최소값 의 연산을 통해 최소값 ~ 최대값의 범위 지정도 가능합니다. (실제적으로는 (int)(Math.random() * (최대값 - 최소값 + 1)) + 최소값  입니다.)

 

예제에서는 1 ~ 100 사이의 random value 를 출력하게 됩니다.

 

1
2
3
4
5
6
7
8
public class RandomTest {
    public static void main(String[] args) {
        // range : 0.0 ~ 1.0(exclusive)
        double randomValue = Math.random();    
        int intValue = (int)(randomValue * 100) + 1;
        System.out.println(intValue);
    }
}
cs

 

<결과>

75 

 

 

Posted by maze1008
,

이클립스를 설치하고 예제를 작성하고 있는데, 한글이 굉장히 작게 보이는 현상을 발견했습니다.

 

이클립스 글자크기 (폰트)를 변경하고 싶을 때 또는 한글이 작게 보일 때 

폰트를 설정하는 방법을 설명해 드리도록 하겠습니다.

 

 

 

예제처럼 "한글만' 굉장히 작게 보여지는 현상을 발견했습니다.

현재 설정되어 있는 폰트에서 한국어를 지원하지 않는 경우 이런 현상이 발생하기 때문에 사용중인 폰트를 변경해 주면 됩니다.

 

 

 

Window 메뉴 > Preferences 를 선택합니다.

 

 

 

좌측에서 General > Appearance > Colors and Fonts 를 선택하고

우측 네모 박스에서 Basic 를 클릭합니다.

 

 

 

스크롤을 내려서 Text Font 를 선택하고

Edit 버튼을 클릭합니다.

 

 

 

처음 이클립스를 설치했을 때에는 폰트가 Consolas 로 설정되어 있는 것을 확인하실 수 있으며

원하시는 것을 찾아 선택하시면 됩니다.(저는 일반적으로 사용되는 courier New 를 선택했습니다.)

확인 버튼을 클릭합니다.

 

 

선택한 폰트가 적용되어 한글이 정상적인 크기로 보여지는 것을 확인할 수 있습니다.

 

지금과 같은 방법으로 이클립스에서 사용하길 원하는 글꼴, 글자크기를 설정하여 사용하실 수 있으며

이클립스 테마 적용하기  를 참고하여 테마도 적용할 수 있습니다.

 

'IT > Eclipse' 카테고리의 다른 글

이클립스 메모리 설정  (0) 2015.04.08
이클립스 자동줄맞춤  (0) 2015.04.07
이클립스 단축키  (0) 2015.03.15
이클립스 테마 적용하기  (0) 2015.03.10
이클립스 다운로드 및 설치방법  (0) 2015.03.04

Posted by maze1008
,

cmd 명령어 또는 명령 프롬프트 명령어 또는 dos 명령어 라고 다양하게 불리우는

 

명령어 모음에 대해서 소개해 드리고자 합니다.

 

 

1. 명령 프롬프트 실행하기

 

기존의 다른 글에서 자바 버전 확인 / 맥 어드레스(max 주소) 확인 등을 소개해 드리면서

 

명령 프롬프트를 사용하는 방법에 대해서 소개해 드린적이 있습니다.

 

 

 

시작 메뉴를 클릭하여 cmd 를 입력후 Enter 버튼을 누릅니다.

 

 

 

명령 프롬프트가 실행됩니다.

이 프로그램에 간단한 명령어들를 입력하여 다양한 작업을 수행할 수 있습니다.

 

 

 

2. cmd 명령어 (명령 프롬프트 명령어) 모음

 

ASSOC : 파일 확장명 연결을 보여주거나 수정합니다.

ATTRIB : 파일 속성을 표시하거나 바꿉니다.

BREAK : 확장된 CTRL+C 검사를 설정하거나 지웁니다.

BCDEDIT : 부팅 로딩을 제어하기 위해 부팅 데이터베이스에서 속성을 설정합니다.

CACLS : 파일의 액세스 컨트롤 목록(ACL)을 표시하거나 수정합니다.

CALL : 한 일괄 프로그램에서 다른 일괄 프로그램을 호출합니다.

CD : 현재 디렉터리 이름을 보여주거나 바꿉니다. (다른 디렉토리로 이동할 수 있습니다.)

CHCP : 활성화된 코드 페이지의 번호를 표시하거나 설정합니다.

CHDIR : 현재 디렉터리 이름을 보여주거나 바꿉니다.

CHKDSK : 디스크를 검사하고 상태 보고서를 표시합니다.

CHKNTFS : 부팅하는 동안 디스크 확인을 화면에 표시하거나 변경합니다.

CLS : 화면을 지웁니다.

CMD : Windows 명령 인터프리터의 새 인스턴스를 시작합니다.

COLOR : 콘솔의 기본색과 배경색을 설정합니다.

COMP : 두 개 또는 여러 개의 파일을 비교합니다.

COMPACT NTFS : 분할 영역에 있는 파일의 압축을 표시하거나 변경합니다.

CONVERT FAT : 볼륨을 NTFS로 변환합니다. 현재 드라이브는 변환할 수 없습니다.

COPY : 하나 이상의 파일을 다른 위치로 복사합니다.

DATE : 날짜를 보여주거나 설정합니다.

DEL : 하나 이상의 파일을 지웁니다.

DIR : 디렉터리에 있는 파일과 하위 디렉터리 목록을 보여줍니다.

DISKCOMP : 두 플로피 디스크의 내용을 비교합니다.

DISKCOPY : 플로피 디스크의 내용을 다른 플로피 디스크로 복사합니다.

DISKPART : 디스크 파티션 속성을 표시하거나 구성합니다.

DOSKEY : 명령줄을 편집하고, Windows 명령을 다시 호출하고, 매크로를 만듭니다.

DRIVERQUERY : 현재 장치 드라이버 상태와 속성을 표시합니다.

ECHO : 메시지를 표시하거나 ECHO를 사용 또는 사용하지 않습니다.

ENDLOCAL : 배치 파일에서 환경 변경의 지역화를 끝냅니다.

ERASE : 하나 이상의 파일을 지웁니다.

EXIT : CMD.EXE 프로그램(명령 인터프리터)을 마칩니다.

FC : 두 파일 또는 파일의 집합을 비교하여 다른 점을 표시합니다.

FIND : 파일에서 텍스트 문자열을 찾습니다.

FINDSTR : 파일에서 문자열을 찾습니다.

FOR : 파일 집합에서 각 파일에 대해 지정된 명령을 실행합니다.

FORMAT : Windows에서 사용할 디스크를 포맷합니다.

FSUTIL : 파일 시스템 속성을 표시하거나 구성합니다.

FTYPE : 파일 확장 연결에 사용되는 파일 형식을 표시하거나 수정합니다.

GOTO : Windows 명령 인터프리터가 일괄 프로그램에서 이름표가 붙여진 줄로 이동합니다.

GPRESULT : 컴퓨터 또는 사용자에 대한 그룹 정책 정보를 표시합니다.

GRAFTABL : Windows가 그래픽 모드에서 확장 문자 세트를 표시할 수 있게 합니다.

HELP :  Windows 명령어에 관한 도움말을 제공합니다.

ICACLS : 파일과 디렉터리에 대한 ACL을 표시, 수정, 백업 또는 복원합니다.

IF : 일괄 프로그램에서 조건 처리를 수행합니다.

LABEL : 디스크의 볼륨 이름을 만들거나, 바꾸거나, 지웁니다.

MD : 디렉터리를 만듭니다.

MKDIR : 디렉터리를 만듭니다.

MKLINK : 기호화된 링크와 하드 링크를 만듭니다.

MODE : 시스템 장치를 구성합니다.

MORE : 출력을 한번에 한 화면씩 표시합니다.

MOVE : 하나 이상의 파일을 한 디렉터리에서 다른 디렉터리로 옮깁니다.

OPENFILES : 파일 공유에서 원격 사용자에 의해 열린 파일을 표시합니다.

PATH : 실행 파일의 찾기 경로를 보여주거나 설정합니다.

PAUSE  : 배치 파일의 처리를 보류하고 메시지를 보여줍니다.

POPD : PUSHD 명령으로 저장된 디렉터리로 바꿉니다.

PRINT : 텍스트 파일을 인쇄합니다.

PROMPT : Windows 명령 프롬프트를 바꿉니다.

PUSHD : 현재 디렉터리를 저장한 후 디렉터리를 바꿉니다.

RD : 디렉터리를 지웁니다.

RECOVER : 불량이거나 결함이 있는 디스크에서 읽을 수 있는 정보를 복구합니다.

REM : 배치 파일 또는 CONFIG.SYS에서 주석을 기록합니다.

REN : 파일 이름을 바꿉니다.

RENAME : 파일 이름을 바꿉니다.

REPLACE : 파일을 대체합니다.

RMDIR : 디렉터리를 지웁니다.

ROBOCOPY : 파일과 디렉터리 트리를 복사할 수 있는 고급 유틸리티입니다.

SET : Windows 환경 변수를 보여주거나, 설정하거나, 지웁니다.

SETLOCAL : 배치 파일에서 환경 변경의 지역화를 시작합니다.

SC : 서비스를 표시하거나 구성합니다(백그라운드 작업).

SCHTASKS : 컴퓨터에서 실행할 명령과 프로그램을 예약합니다.

SHIFT : 배치 파일에서 바꿀 수 있는 매개 변수의 위치를 바꿉니다.

SHUTDOWN : 컴퓨터의 로컬 또는 원격 종료를 허용합니다.

SORT : 입력을 정렬합니다.

START : 지정된 프로그램이나 명령을 별도의 창에서 시작합니다.

SUBST : 경로를 드라이브 문자로 지정합니다.

SYSTEMINFO : 특정 컴퓨터의 속성과 구성을 표시합니다.

TASKLIST : 서비스를 포함한 실행 중인 모든 작업을 표시합니다.

TASKKILL : 실행 중인 프로세스나 응용 프로그램을 중지합니다.

TIME : 시스템 시간을 보여주거나 설정합니다.

TITLE : CMD.EXE 세션에 대한 창의 창 제목을 설정합니다.

TREE : 드라이브 또는 경로의 디렉터리 구조를 그래픽으로 화면에 표시합니다.

TYPE : 텍스트 파일의 내용을 보여줍니다.

VER : Windows 버전을 보여줍니다.

VERIFY : 파일이 디스크에 올바로 쓰였는지 검증할지 여부를 지정합니다.

VOL : 디스크 볼륨 이름과 일련 번호를 보여줍니다.

XCOPY : 파일과 디렉터리 트리를 복사합니다.

WMIC : 대화형 명령 셸 내의 WMI 정보를 표시합니다.

 

calc : 계산기 실행

control : 제어판 실행

cmd : 명령 프롬프트 실행

explorer : 탐색기 실행

ipconfig -all : IP 구성

java –version : 자바 버전 확인

mspaint : 그림판 실행

mstsc : 원격 데스크톱 실행

notepad : 메모장 실행

nslookup : dns 정보와 연관된 도메인 정보 확인

ping : 네트워크 상태 확인

telnet : telnet 접속(연결)

tracert : 네트워크 경로 추적

 

 

혹시 프린트를 해서 컴퓨터 옆에 붙여놓고 사용하고자 하시는 분들을 위해서

2가지 형태의 (word, excel) 파일을 첨부해 놓았습니다.

(이 포스트는 복사가 금지되어 있으므로 파일을 다운받아서 사용해 주시기 바랍니다.)

 

CMD (명령 프롬프트) 명령어 모음(word).docx

 

CMD (명령 프롬프트) 명령어 모음(excel).xlsx

 

Posted by maze1008
,