넥서스원을 기다리는 유저의 입장으로 안드로이드의 어플리케이션 저장 용량에 제한이 걸려있다라는 사실에 꽤나 관심을 가지게 되었습니다.
우선, 국내 언론에서는 상당한 문제점으로 지적하고 있군요. 물론 해외에서도 또한 같은 문제로 이슈되고 있더군요.
문제는 이렇습니다.
아이폰 3GS 에서는 16GB , 32GB 스토리지를 제공하게 되는데 이 모든 스토리지를 App를 위한 공간으로 사용할 수 있다는 점입니다. 따라서 거의 unlimited에 가깝게 많은 어플리케이션을 설치할 수 있지요.
허나, 안드로이드의 경우 확장 메모리카드 스토리지에 App을 설치할 수 없습니다. 따라서 기본 응용프로그램을 제외한 100MB 내외의 용량에서만 어플리케이션을 설치할 수 있지요.
이 이슈에 대해서 의견이 분분합니다. 용량에 제한이 걸려있어서 문제가 있다!!! 이거 뭐냐 너무 실망이다~~ 다른 폰을 사야겠다~~ 등등...
그런데 실제로 넥서스원 혹은 드로이드 폰을 사용하는 유저의 입장은 좀 다르더군요. 실제 자신의 폰이라 애착이 가서 옹호적인 글을 쓴것은 아닐까라는 의구심이 들기는 하지만...ㅎㅎㅎ
그들의 주장을 압축해보면 다음과 같습니다.
1. 구글에서 이 문제에 대해서 현재 수정중에 있다. 그러므로 곧 우리는 많은 SD Card를 이용한 어플리케이션 설치를 지원받을 수 있을 것이다. (이렇게 되면 아마도 플랫폼 업그레이드가 필요하겠지요?)
2. 현재 나는 120개 이상의 어플리케이션을 쓰고 있지만 용량제한은 아무 문제가 되지 않는다. 이유는 배포되는 어플리케이션의 용량이 너무나 작기 때문이다. 일반적으로는 1MB 이하라고 생각하면 된다. 10kb , 100kb 도 많다.
그런데 2번에 대한 주장은 좀 이해하기 힘들더군요. 앞으로 더 많은 어플리케이션이 쏟아질 것이고 그렇게 되면 용량을 많이 차지하는 어플도 존재하게 될 것이고 말이죠.
이를테면 게임의 경우에는 아무래도 용량이 커지겠지요.
저는 구글에서 어서 이 문제를 해결해주었으면 하는 바람을 가지고 넥서스원을 기다리고 있습니다.
아무리 그런다 한들 옴니아2 보다야 100배 좋지 않겠습니까? ㅎㅎㅎ *(삼성 안티는 아니에요 옴니아 안티지 ㅋ)
2010년 2월 25일 목요일
2010년 2월 19일 금요일
[Sort] Selection Sort
Selection Sort(선택 정렬)은 앞서 다룬 Bubble Sort와 마찬가지의 복잡도를 가진다. 그러므로 많은 데이타의 정렬 위해서 쓰기에는 그 퍼포먼스가 현저하게 떨어진다.
하지만 Bubble Sort와 마찬가지로 그 구현 방법에 있어서 빠르기 때문에 작은 단위의 데이타 정렬에서 이용하기에 적합하다고 할 수 있다.
Selection Sort는 배열(혹은 리스트)에서 가장 작은 값을 찾아내어 그 값을 최앞단에 위치 시키는 방식이다.
이렇게 5개의 숫자가 있다고 가정했을 때 다음과 같은 과정을 보인다.
위 과정을 배열의 마지막까지 진행을 하게 되면 정렬이 완료된다.
다음은 프로그램으로 나온 과정이다.
php로 만든 예제
[code php]
<?php
$a = array( 8 , 5 , 1 , 9 , 2);
SelectionSort(& $a);
function SelectionSort($array)
{
$loop_count = count($array);
for($i = 0 ; $i < $loop_count ; $i++)
{
$min = $array[$i];
$minIndex = $i;
/* 최소값을 찾기 위하여 루프를 돌린다. */
for($j = $i ; $j < $loop_count ; $j++)
{
if($array[$j] < $min)
{
$min = $array[$j];
$minIndex = $j;
}
}
swap(& $array[$i] , & $array[$minIndex]);
echo implode(' , ' , $array) . "<br/>";
}
}
function swap($a , $b)
{
$tmp = $b;
$b = $a;
$a = $tmp;
}
?>
[/code]
C++로 구현한 예
[code cpp]
#include <iostream>
using namespace std;
void swap(int *a , int *b)
{
int *tmp = b;
b = a;
a = tmp;
}
int main()
{
int a[5] = {8 , 5 , 1 , 9 , 2};
int loop_count = (sizeof(a) / sizeof(a[0]));
int min , minIndex;
for(int i = 0 ; i < loop_count ;i++)
{
min = a[i];
minIndex = i;
for(int j = i ; j < loop_count ; j++)
{
if(a[j] < min)
{
min = a[j];
minIndex = j;
}
}
swap(a[i] , a[minIndex]);
}
cout << a[0] << endl;
return 0;
}
[/code]
하지만 Bubble Sort와 마찬가지로 그 구현 방법에 있어서 빠르기 때문에 작은 단위의 데이타 정렬에서 이용하기에 적합하다고 할 수 있다.
Selection Sort는 배열(혹은 리스트)에서 가장 작은 값을 찾아내어 그 값을 최앞단에 위치 시키는 방식이다.
Sort 대상 : 8 5 1 9 2
이렇게 5개의 숫자가 있다고 가정했을 때 다음과 같은 과정을 보인다.
8 5 1 9 2 => 최소값을 찾아낸다
1 5 8 9 2 => 1과 비교 대상의 첫번째 인덱스와 바꾼다.
5 8 9 2 => 최소값이 맨 앞단으로 옮겨졌기 때문에 인덱스를 증가하여 비교한다.
2 8 9 5 => 다시 최소값을 찾아 비교 대상의 첫번째 인덱스와 바꾼다.
8 9 5 => 인덱스를 증가하여 다시 비교한다.
1 5 8 9 2 => 1과 비교 대상의 첫번째 인덱스와 바꾼다.
5 8 9 2 => 최소값이 맨 앞단으로 옮겨졌기 때문에 인덱스를 증가하여 비교한다.
2 8 9 5 => 다시 최소값을 찾아 비교 대상의 첫번째 인덱스와 바꾼다.
8 9 5 => 인덱스를 증가하여 다시 비교한다.
위 과정을 배열의 마지막까지 진행을 하게 되면 정렬이 완료된다.
다음은 프로그램으로 나온 과정이다.
8 , 5 ,1 , 9 , 2
1 , 5 , 8 , 9 , 2
1 , 2 , 8 , 9 , 5
1 , 2 , 5 , 9 , 8
1 , 2 , 5 , 8 , 9
1 , 2 , 5 , 8 , 9
1 , 5 , 8 , 9 , 2
1 , 2 , 8 , 9 , 5
1 , 2 , 5 , 9 , 8
1 , 2 , 5 , 8 , 9
1 , 2 , 5 , 8 , 9
php로 만든 예제
[code php]
<?php
$a = array( 8 , 5 , 1 , 9 , 2);
SelectionSort(& $a);
function SelectionSort($array)
{
$loop_count = count($array);
for($i = 0 ; $i < $loop_count ; $i++)
{
$min = $array[$i];
$minIndex = $i;
/* 최소값을 찾기 위하여 루프를 돌린다. */
for($j = $i ; $j < $loop_count ; $j++)
{
if($array[$j] < $min)
{
$min = $array[$j];
$minIndex = $j;
}
}
swap(& $array[$i] , & $array[$minIndex]);
echo implode(' , ' , $array) . "<br/>";
}
}
function swap($a , $b)
{
$tmp = $b;
$b = $a;
$a = $tmp;
}
?>
[/code]
C++로 구현한 예
[code cpp]
#include <iostream>
using namespace std;
void swap(int *a , int *b)
{
int *tmp = b;
b = a;
a = tmp;
}
int main()
{
int a[5] = {8 , 5 , 1 , 9 , 2};
int loop_count = (sizeof(a) / sizeof(a[0]));
int min , minIndex;
for(int i = 0 ; i < loop_count ;i++)
{
min = a[i];
minIndex = i;
for(int j = i ; j < loop_count ; j++)
{
if(a[j] < min)
{
min = a[j];
minIndex = j;
}
}
swap(a[i] , a[minIndex]);
}
cout << a[0] << endl;
return 0;
}
[/code]
2010년 2월 18일 목요일
[Sort] Bubble Sort
Bubble Sort 의 시간 복잡도는 상당히 높다. - worst case 일 경우에 O(n2)
그러나 이 엄청나게 느린 알고리즘을 사용하는 이유가 무엇일까...
시간 복잡도가 높다 하더라도 우리에게 주는 혜택은 당연 존재한다.
그렇다면 그 실체는 어떤것일까,
이렇게 5개의 숫자가 있다고 가정했을 경우 다음은 Bubble Sort 과정을 보여준다.
이렇게 Bubble Sort는 순차적으로 배열을 앞, 뒤로 비교를 하며 다음 인덱스로 넘어가면서 동일한 작업을 반복하게 된다.
아직 완벽하게 정렬되지 않았는데 저렇게 여러번 같은 작업을 반복하게 되면 끝내 정렬이 완료된다.
다음을 프로그램을 직접 돌려 과정을 출력한 것이다.
PHP로 구현한 예.
[code php]
<?php
function BubbleSort($array , $call_reference = FALSE)
{
/* $array 값이 array인지 체크 */
if(is_array($array))
{
/* 가장 마지막 아이템은 비교 하지 않기 때문에 -1 을 합니다. */
$loop_count = count($array) - 1;
do{
/* flag는 정렬이 제대로 되었을 경우 루프를 빠지기 위한 확인 값이다. */
$flag = false;
for($i = 0 ; $i < $loop_count ; $i++)
{
if($array[$i] > $array[$i + 1])
{
swap(& $array[$i] , & $array[$i + 1]);
$flag = true; /* 정렬이 되었으면 루프를 진행하기 위하여 true로 변경 */
}
}
}while($flag); /* flag가 false가 될 때까지 루프 */
if($call_reference === FALSE)
return($array);
}
}
/* 스왑 함수 */
function swap($a , $b)
{
$tmp = $b;
$b = $a;
$a = $tmp;
}
?>
[/code]
C++ 로 구현한 예
[code cpp]
#include <iostream>
using namespace std;
void swap(int *a , int *b)
{
int *tmp = b;
b = a;
a = tmp;
}
int main()
{
int a[5] = {8 , 5 , 1 , 9 , 2};
int loop_count = (sizeof(a) / sizeof(a[0])) - 1;
bool flag = false;
do{
flag = false;
for(int i = 0 ; i < loop_count ; i++)
{
if(a[i] > a[i +1])
{
swap(a[i] , a[i + 1]);
flag = true;
}
}
}while(flag);
return 0;
}
[/code]
그러나 이 엄청나게 느린 알고리즘을 사용하는 이유가 무엇일까...
시간 복잡도가 높다 하더라도 우리에게 주는 혜택은 당연 존재한다.
로직이 상대적으로 단순하여 프로그램상 구현하기가 쉽다.
그렇다면 그 실체는 어떤것일까,
Sort 대상 : 8 5 1 9 2
이렇게 5개의 숫자가 있다고 가정했을 경우 다음은 Bubble Sort 과정을 보여준다.
8 5 1 9 2 => 맨 처음 item과 그 다음에 존재하는 item을 비교한다.
5 8 1 9 2 => 첫번째 아이템이 다음의 아이템 보다 크므로 두 숫자를 바꿔준다.
5 8 1 9 2 => 그럼 인덱스를 한칸 옮겨 2번 아이템과 3번 아이템을 비교 한다.
5 1 8 9 2 => 역시 앞에 있는 아이템이 크므로 다음 아이템과 바꿔준다.
5 1 8 9 2 => 다시 인덱스를 한칸 옮겨 3번 아이템과 4번 아이템을 비교한다.
5 1 8 9 2 => 이번엔 뒤에 나온 아이템이 더 큰 수이므로 바꿀 필요가 없다.
5 1 8 9 2 => 인덱스를 한칸 옮겨 4번 아이템과 5번 아이템을 비교한다.
5 1 8 2 9 => 뒤에 나온 아이템이 더 작은 수이므로 앞의 아이템과 바꿔준다.
5 8 1 9 2 => 첫번째 아이템이 다음의 아이템 보다 크므로 두 숫자를 바꿔준다.
5 8 1 9 2 => 그럼 인덱스를 한칸 옮겨 2번 아이템과 3번 아이템을 비교 한다.
5 1 8 9 2 => 역시 앞에 있는 아이템이 크므로 다음 아이템과 바꿔준다.
5 1 8 9 2 => 다시 인덱스를 한칸 옮겨 3번 아이템과 4번 아이템을 비교한다.
5 1 8 9 2 => 이번엔 뒤에 나온 아이템이 더 큰 수이므로 바꿀 필요가 없다.
5 1 8 9 2 => 인덱스를 한칸 옮겨 4번 아이템과 5번 아이템을 비교한다.
5 1 8 2 9 => 뒤에 나온 아이템이 더 작은 수이므로 앞의 아이템과 바꿔준다.
이렇게 Bubble Sort는 순차적으로 배열을 앞, 뒤로 비교를 하며 다음 인덱스로 넘어가면서 동일한 작업을 반복하게 된다.
아직 완벽하게 정렬되지 않았는데 저렇게 여러번 같은 작업을 반복하게 되면 끝내 정렬이 완료된다.
다음을 프로그램을 직접 돌려 과정을 출력한 것이다.
8 , 5 , 1 , 9 , 2
5 , 8 , 1 , 9 , 2
5 , 1 , 8 , 9 , 2
5 , 1 , 8 , 9 , 2
/////////////// 1차 정렬 종료
5 , 1 , 8 , 2 , 9
1 , 5 , 8 , 2 , 9
1 , 5 , 8 , 2 , 9
1 , 5 , 2 , 8 , 9
////////////// 2차 정렬 종료
1 , 5 , 2 , 8 , 9
1 , 5 , 2 , 8 , 9
1 , 2 , 5 , 8 , 9
1 , 2 , 5 , 8 , 9
///////////// 3차 정렬 종료
1 , 2 , 5 , 8 , 9
1 , 2 , 5 , 8 , 9
1 , 2 , 5 , 8 , 9
1 , 2 , 5 , 8 , 9
//////////// 완료
5 , 8 , 1 , 9 , 2
5 , 1 , 8 , 9 , 2
5 , 1 , 8 , 9 , 2
/////////////// 1차 정렬 종료
5 , 1 , 8 , 2 , 9
1 , 5 , 8 , 2 , 9
1 , 5 , 8 , 2 , 9
1 , 5 , 2 , 8 , 9
////////////// 2차 정렬 종료
1 , 5 , 2 , 8 , 9
1 , 5 , 2 , 8 , 9
1 , 2 , 5 , 8 , 9
1 , 2 , 5 , 8 , 9
///////////// 3차 정렬 종료
1 , 2 , 5 , 8 , 9
1 , 2 , 5 , 8 , 9
1 , 2 , 5 , 8 , 9
1 , 2 , 5 , 8 , 9
//////////// 완료
PHP로 구현한 예.
[code php]
<?php
function BubbleSort($array , $call_reference = FALSE)
{
/* $array 값이 array인지 체크 */
if(is_array($array))
{
/* 가장 마지막 아이템은 비교 하지 않기 때문에 -1 을 합니다. */
$loop_count = count($array) - 1;
do{
/* flag는 정렬이 제대로 되었을 경우 루프를 빠지기 위한 확인 값이다. */
$flag = false;
for($i = 0 ; $i < $loop_count ; $i++)
{
if($array[$i] > $array[$i + 1])
{
swap(& $array[$i] , & $array[$i + 1]);
$flag = true; /* 정렬이 되었으면 루프를 진행하기 위하여 true로 변경 */
}
}
}while($flag); /* flag가 false가 될 때까지 루프 */
if($call_reference === FALSE)
return($array);
}
}
/* 스왑 함수 */
function swap($a , $b)
{
$tmp = $b;
$b = $a;
$a = $tmp;
}
?>
[/code]
C++ 로 구현한 예
[code cpp]
#include <iostream>
using namespace std;
void swap(int *a , int *b)
{
int *tmp = b;
b = a;
a = tmp;
}
int main()
{
int a[5] = {8 , 5 , 1 , 9 , 2};
int loop_count = (sizeof(a) / sizeof(a[0])) - 1;
bool flag = false;
do{
flag = false;
for(int i = 0 ; i < loop_count ; i++)
{
if(a[i] > a[i +1])
{
swap(a[i] , a[i + 1]);
flag = true;
}
}
}while(flag);
return 0;
}
[/code]
2010년 2월 17일 수요일
Windows에서 Ubuntu 9.10 로! #5
# 우분투 9.10을 처음 시작하게 되면 가독성 때문에 다소 애를 먹을 수가 있습니다. 이때 폰트를 설정해야 하는데 윈도우즈에 익숙한 우리에게 맞는 기본 폰트는 존재하지 않더군요.
그래서 공개용 글꼴
네이버 사전체 를 사용해야 합니다. (혹은, 기타 공개 폰트들)
네이버 사전체를 다운로드 받으셨다면 아마도 ~/다운로드 폴더에 존재하지 않을까 합니다.(기본 FF로 다운로드를 받으셨다면 말이죠)
일단 압축을 해제 합니다. 파일 브라우저에서 더블 클릭하셔도 되며 , 터미널에서 다음 명령어를 치셔도 됩니다.
그럼 압축이 풀리면서 naverdic.ttf 파일이 하나 튀어나옵니다.
요 파일을 시스템에서 사용할 수 있게 옮겨야 합니다.
별다른 설정은 없고 단지 관리자 권한으로 해당 폴더에 넣으시면 됩니다.
일단 파일을 좀더 쉽게 관리하기 위해서 /usr/share/fonts/truetype/ 에 ttf-naverdic 이라는 폴더를 만들고 그곳에 파일을 옮기도록 하겠습니다.
자 여기 까지하셨다면 성공입니다.
그럼 글꼴을 변경하도록 해보겠습니다.
글꼴 변경은 시스템 -> 기본 설정 -> 모양새 -> 글꼴 탭 에서 할 수 있습니다.

자 그럼 그런데 이상하게도 파이어폭스에서의 폰트를 변경되지 않는군요.
그럼 파이어폭스의 기본 글꼴도 변경하도록 하지요.
파이어폭스를 키시고
편집 -> 환경설정 -> 내용 탭으로 가시면 글꼴을 변경하실 수 있습니다.

그래서 공개용 글꼴
네이버 사전체 를 사용해야 합니다. (혹은, 기타 공개 폰트들)
네이버 사전체를 다운로드 받으셨다면 아마도 ~/다운로드 폴더에 존재하지 않을까 합니다.(기본 FF로 다운로드를 받으셨다면 말이죠)
일단 압축을 해제 합니다. 파일 브라우저에서 더블 클릭하셔도 되며 , 터미널에서 다음 명령어를 치셔도 됩니다.
cd ~/다운로드
tar xzvf naverdic.tgz
tar xzvf naverdic.tgz
그럼 압축이 풀리면서 naverdic.ttf 파일이 하나 튀어나옵니다.
요 파일을 시스템에서 사용할 수 있게 옮겨야 합니다.
별다른 설정은 없고 단지 관리자 권한으로 해당 폴더에 넣으시면 됩니다.
일단 파일을 좀더 쉽게 관리하기 위해서 /usr/share/fonts/truetype/ 에 ttf-naverdic 이라는 폴더를 만들고 그곳에 파일을 옮기도록 하겠습니다.
sudo mkdir /usr/share/fonts/truetype/ttf-naverdic
sudo mv ~/다운로드/naverdic.ttf /usr/share/fonts/truetype/ttf-naverdic/naverdic.ttf
sudo mv ~/다운로드/naverdic.ttf /usr/share/fonts/truetype/ttf-naverdic/naverdic.ttf
자 여기 까지하셨다면 성공입니다.
그럼 글꼴을 변경하도록 해보겠습니다.
글꼴 변경은 시스템 -> 기본 설정 -> 모양새 -> 글꼴 탭 에서 할 수 있습니다.

자 그럼 그런데 이상하게도 파이어폭스에서의 폰트를 변경되지 않는군요.
그럼 파이어폭스의 기본 글꼴도 변경하도록 하지요.
파이어폭스를 키시고
편집 -> 환경설정 -> 내용 탭으로 가시면 글꼴을 변경하실 수 있습니다.

Windows에서 Ubuntu 9.10 로! #4
#1. 이제 그래픽 드라이버도 잘 깔아놨으니 그래픽 드라이버를 십분 활용해봐야겠지요?
많이들 아시겠지만, 리눅스는 윈도우보다 좀더 역동적인 화면효과를 줄 수 있습니다. 어찌보면 윈도우 7 도 울고갈 정도로 아주 멋진 기능이지요. 아~ 물론 안전성이나 성능에서도 큰 문제는 없습니다. (간혹 버그가 보이긴 하지만요 ^^;;;)
우분투 9.10 에서는 기본적으로 compiz가 설치되어있습니다. 자 그런데 이 compiz란 놈이 무얼 하는 녀석이냐~ 이놈의 화면 효과를 주는 놈이지요.
아주 간단하게 맛보기를 하시려면
이렇게 해보시면 화면이 많이 ~~ 멋있어졌다라는 것을 느끼실 겁니다.

물론 효과가 많으면 많을 수록 시스템 자원을 많이 잡아먹는건 당연하니 시스템 사양에 맞게 적절한 선택을 해주어야 겠지만.
#2. 하지만 이것으로도 불편할 때가 있습니다. 왜냐하면 세세한 설정을 할 수 없기 때문이지요. 게다가 어떤 효과가 있는지도 모르니, 좀더 커스터마이징 해보고 싶은데 하질 못하게 된다면 좀 서운할 것 같네요.
그럴때 이 compiz를 관리해주는 매니져를 설치해야 합니다.
체크 하고 설치~~

자 설치 하고 나면 해당 관리자는 다음과 같은 경로에서 실행시킬 수 있습니다.

이리저리 둘러보시면서 체크를 하여 여러가지 효과를 설정할 수 있습니다. 아이콘을 클릭하면 해당 효과를 세부적으로 설정할 수 있지요.
예를 들어서 단축키를 다르게 설정한다던지, 혹은 효과의 duration을 설정한다던지 등등말이죠.
많이들 아시겠지만, 리눅스는 윈도우보다 좀더 역동적인 화면효과를 줄 수 있습니다. 어찌보면 윈도우 7 도 울고갈 정도로 아주 멋진 기능이지요. 아~ 물론 안전성이나 성능에서도 큰 문제는 없습니다. (간혹 버그가 보이긴 하지만요 ^^;;;)
우분투 9.10 에서는 기본적으로 compiz가 설치되어있습니다. 자 그런데 이 compiz란 놈이 무얼 하는 녀석이냐~ 이놈의 화면 효과를 주는 놈이지요.
아주 간단하게 맛보기를 하시려면
시스템 -> 기본 설정 -> 모양새 -> 화면 효과 -> 많이 체크
이렇게 해보시면 화면이 많이 ~~ 멋있어졌다라는 것을 느끼실 겁니다.

물론 효과가 많으면 많을 수록 시스템 자원을 많이 잡아먹는건 당연하니 시스템 사양에 맞게 적절한 선택을 해주어야 겠지만.
#2. 하지만 이것으로도 불편할 때가 있습니다. 왜냐하면 세세한 설정을 할 수 없기 때문이지요. 게다가 어떤 효과가 있는지도 모르니, 좀더 커스터마이징 해보고 싶은데 하질 못하게 된다면 좀 서운할 것 같네요.
그럴때 이 compiz를 관리해주는 매니져를 설치해야 합니다.
시스템 -> 관리 -> 시냅틱 패키지 관리자 -> 빠른 검색에 -> compiz-settings-manager
체크 하고 설치~~

자 설치 하고 나면 해당 관리자는 다음과 같은 경로에서 실행시킬 수 있습니다.
시스템 -> 기본설정 -> 컴피즈 설정 관리자

이리저리 둘러보시면서 체크를 하여 여러가지 효과를 설정할 수 있습니다. 아이콘을 클릭하면 해당 효과를 세부적으로 설정할 수 있지요.
예를 들어서 단축키를 다르게 설정한다던지, 혹은 효과의 duration을 설정한다던지 등등말이죠.
라벨:
우분투,
컴피즈,
컴피즈 매니저,
컴피즈 매니져,
화면효과,
Compiz,
compiz manager,
Desktop,
Ubuntu,
Ubuntu 9.10
2010년 2월 9일 화요일
OSX 사용기...
iPhone 어플리케이션 개발을 위하여 회사에서 거금(?)을 투자하여 iMac을 구입하게되었다.
뭐 일단은 iPhone Developer 인증 진행중이라 아직 SDK를 깔아서 플밍을 시작하지는 않아 이것저것 만지작 만지작 거리며 구경하게 되었는데...
아... 정말이지...
Linux(gnome , KDE) , Windows 시리즈 모두 사용해보았지만...
나에게는 왜이렇게 Mac이 불편하기만 할까...
이것저것 만지면 일단 키보드 레이아웃 부터 적응을 다시 해야 하기 때문에 여러가지 불편한점이 한두개가 아니다...
더군다가 파워유저가 되려면 이것저것 많은 설정을 해야 하는데 아직은 경험도 없고...
초딩때 애플컴퓨터(그때 당시 아마 8 bit 였떠랬죠?) 만저본 이후 처음이라 그런가... ㅋㅋㅋ
아무튼, 새로운 것을 접하게 된 계기는 무척이나 좋았다만
글쎄다... 나의 새로운 지식 습득의 열정이 한풀 꺽였는지... 왠지 이놈은 다시는 거들떠 보고 싶지도 않을 정도다...
하지만 iPhone 어플 개발을 위해서 어쩔 수 없이 이놈과 친해져야 하다니...
이거.. 근데.. 스크린샷 어떻게 찍는거야 도대체 ... -_-;;; 이노무 애플...
뭐 일단은 iPhone Developer 인증 진행중이라 아직 SDK를 깔아서 플밍을 시작하지는 않아 이것저것 만지작 만지작 거리며 구경하게 되었는데...
아... 정말이지...
Linux(gnome , KDE) , Windows 시리즈 모두 사용해보았지만...
나에게는 왜이렇게 Mac이 불편하기만 할까...
이것저것 만지면 일단 키보드 레이아웃 부터 적응을 다시 해야 하기 때문에 여러가지 불편한점이 한두개가 아니다...
더군다가 파워유저가 되려면 이것저것 많은 설정을 해야 하는데 아직은 경험도 없고...
초딩때 애플컴퓨터(그때 당시 아마 8 bit 였떠랬죠?) 만저본 이후 처음이라 그런가... ㅋㅋㅋ
아무튼, 새로운 것을 접하게 된 계기는 무척이나 좋았다만
글쎄다... 나의 새로운 지식 습득의 열정이 한풀 꺽였는지... 왠지 이놈은 다시는 거들떠 보고 싶지도 않을 정도다...
하지만 iPhone 어플 개발을 위해서 어쩔 수 없이 이놈과 친해져야 하다니...
이거.. 근데.. 스크린샷 어떻게 찍는거야 도대체 ... -_-;;; 이노무 애플...
-- 아 찾았따... -_-;;;

2010년 2월 5일 금요일
페이징 클래스
페이징 클래스 짜기가 귀찮아서 웹서핑을 하는 도중 2008년도에 내가 만든 소스를 발견.......
이런 우연이... -_-;;; 후덜덜...
아무튼, 자료를 한곳으로 모으기로 하였으니 이곳에 모아두어야 겠당.
[code java]
/*
* Author : Mikelim(mikelim@ciyah.com)
*
* Pagination Class
*
* @properties
* firstLink , prevLink, nextLink , lastLink : set up image or text if you want.
* delimiter : set up image or text
* prewrap , postwrap : currentPage design wrapper tag
*/
public class Pagination {
private int totalRows = 0;
private int currentPage = 1;
private int pageSize = 10;
private int blockSize = 10;
private int totalPages;
private int totalBlocks;
private int startPageNum;
private int endPageNum;
private int currentBlock;
private String amp = "";
// for design
public String firstLink = "[<<]";
public String firstOffLink = "";
public String prevLink = "[<]";
public String prevOffLink = "";
public String nextLink = "[>]";
public String nextOffLink = "";
public String lastLink = "[>>]";
public String lastOffLink = "";
public String delimiter = "|";
// current Page Wrapper
public String preWrap = "<b>";
public String postWrap = "</b>";
public String linkPage = "";
public String queryString = "";
// result temp object
public StringBuffer pageString = new StringBuffer();
public Pagination(int currentPage , int pageSize , int blockSize , int totalRows)
{
this.currentPage = currentPage;
this.pageSize = pageSize;
this.blockSize = blockSize;
this.totalRows = totalRows;
initialize();
}
public void initialize()
{
this.totalPages = (int)Math.ceil((double)this.totalRows / this.pageSize);
this.totalBlocks = (int)Math.ceil((double)this.totalPages / this.blockSize);
this.currentBlock = (int)Math.ceil((double)((this.currentPage - 1) / this.blockSize)) + 1;
this.startPageNum = ((this.currentBlock - 1) * this.pageSize) + 1;
this.endPageNum = this.startPageNum + this.pageSize;
}
public void prePrint()
{
// set first block link
if(this.currentBlock > 1)
pageString.append("<a href=\"" + this.linkPage + "?" + this.queryString + this.amp + "pg=" + (((this.currentBlock - 2) * this.pageSize) + 1) + "\">" + this.firstLink + "</a> ");
else
pageString.append(this.firstOffLink + " ");
// set prev page link
if(this.currentPage > 1)
pageString.append("<a href=\"" + this.linkPage + "?" + this.queryString + this.amp + "pg=" + (this.currentPage - 1) + "\">" + this.prevLink + "</a> ");
else
pageString.append(this.prevOffLink + " ");
}
public void postPrint()
{
// set next page link
if(this.currentPage < this.totalPages )
pageString.append("<a href=\"" + this.linkPage + "?" + this.queryString + this.amp + "pg=" + (this.currentPage + 1) + "\">" + this.nextLink + "</a> ");
else
pageString.append(this.nextOffLink + " ");
// set last page link
if(this.currentBlock < this.totalBlocks)
pageString.append("<a href=\"" + this.linkPage + "?" + this.queryString + this.amp + "pg=" + ((this.currentBlock * this.pageSize) + 1) + "\">" + this.lastLink + "</a> ");
else
pageString.append(this.lastOffLink);
}
public void printList()
{
for(int i = startPageNum ; i <= endPageNum ; i++)
{
if(i > this.totalPages || i == endPageNum)
break;
else if(i > startPageNum)
pageString.append(this.delimiter);
if(i == this.currentPage)
pageString.append(" " + this.preWrap + i + this.postWrap + " ");
else
pageString.append(" <a href=\"" + this.linkPage + "?" + this.queryString + this.amp + "pg=" + i + "\">" + i + "</a> ");
}
}
public String print()
{
// set amp if already to set up queryString property
if(!this.queryString.equals(""))
this.amp = "&";
if(this.totalPages > 1)
{
this.prePrint();
this.printList();
this.postPrint();
}
return(pageString.toString());
}
/**
* @param args
*/
/*
public static void main(String[] args) {
// TODO Auto-generated method stub
Pagination pg = new Pagination(20 , 10, 10 , 352);
pg.linkPage = "pagenum.jsp";
pg.queryString = "param1=test¶m2=test2";
// for design
pg.firstLink = "<img src=\"/first.gif\">";
pg.prevLink = "<img src=\"/prev.gif\">";
pg.nextLink = "<img src=\"/next.gif\">";
pg.lastLink = "<img src=\"/last.gif\">";
pg.delimiter = "|";
//print
System.out.println(pg.print());
}
*/
}
[/code]
소스파일은 첨부~~
이런 우연이... -_-;;; 후덜덜...
아무튼, 자료를 한곳으로 모으기로 하였으니 이곳에 모아두어야 겠당.
[code java]
/*
* Author : Mikelim(mikelim@ciyah.com)
*
* Pagination Class
*
* @properties
* firstLink , prevLink, nextLink , lastLink : set up image or text if you want.
* delimiter : set up image or text
* prewrap , postwrap : currentPage design wrapper tag
*/
public class Pagination {
private int totalRows = 0;
private int currentPage = 1;
private int pageSize = 10;
private int blockSize = 10;
private int totalPages;
private int totalBlocks;
private int startPageNum;
private int endPageNum;
private int currentBlock;
private String amp = "";
// for design
public String firstLink = "[<<]";
public String firstOffLink = "";
public String prevLink = "[<]";
public String prevOffLink = "";
public String nextLink = "[>]";
public String nextOffLink = "";
public String lastLink = "[>>]";
public String lastOffLink = "";
public String delimiter = "|";
// current Page Wrapper
public String preWrap = "<b>";
public String postWrap = "</b>";
public String linkPage = "";
public String queryString = "";
// result temp object
public StringBuffer pageString = new StringBuffer();
public Pagination(int currentPage , int pageSize , int blockSize , int totalRows)
{
this.currentPage = currentPage;
this.pageSize = pageSize;
this.blockSize = blockSize;
this.totalRows = totalRows;
initialize();
}
public void initialize()
{
this.totalPages = (int)Math.ceil((double)this.totalRows / this.pageSize);
this.totalBlocks = (int)Math.ceil((double)this.totalPages / this.blockSize);
this.currentBlock = (int)Math.ceil((double)((this.currentPage - 1) / this.blockSize)) + 1;
this.startPageNum = ((this.currentBlock - 1) * this.pageSize) + 1;
this.endPageNum = this.startPageNum + this.pageSize;
}
public void prePrint()
{
// set first block link
if(this.currentBlock > 1)
pageString.append("<a href=\"" + this.linkPage + "?" + this.queryString + this.amp + "pg=" + (((this.currentBlock - 2) * this.pageSize) + 1) + "\">" + this.firstLink + "</a> ");
else
pageString.append(this.firstOffLink + " ");
// set prev page link
if(this.currentPage > 1)
pageString.append("<a href=\"" + this.linkPage + "?" + this.queryString + this.amp + "pg=" + (this.currentPage - 1) + "\">" + this.prevLink + "</a> ");
else
pageString.append(this.prevOffLink + " ");
}
public void postPrint()
{
// set next page link
if(this.currentPage < this.totalPages )
pageString.append("<a href=\"" + this.linkPage + "?" + this.queryString + this.amp + "pg=" + (this.currentPage + 1) + "\">" + this.nextLink + "</a> ");
else
pageString.append(this.nextOffLink + " ");
// set last page link
if(this.currentBlock < this.totalBlocks)
pageString.append("<a href=\"" + this.linkPage + "?" + this.queryString + this.amp + "pg=" + ((this.currentBlock * this.pageSize) + 1) + "\">" + this.lastLink + "</a> ");
else
pageString.append(this.lastOffLink);
}
public void printList()
{
for(int i = startPageNum ; i <= endPageNum ; i++)
{
if(i > this.totalPages || i == endPageNum)
break;
else if(i > startPageNum)
pageString.append(this.delimiter);
if(i == this.currentPage)
pageString.append(" " + this.preWrap + i + this.postWrap + " ");
else
pageString.append(" <a href=\"" + this.linkPage + "?" + this.queryString + this.amp + "pg=" + i + "\">" + i + "</a> ");
}
}
public String print()
{
// set amp if already to set up queryString property
if(!this.queryString.equals(""))
this.amp = "&";
if(this.totalPages > 1)
{
this.prePrint();
this.printList();
this.postPrint();
}
return(pageString.toString());
}
/**
* @param args
*/
/*
public static void main(String[] args) {
// TODO Auto-generated method stub
Pagination pg = new Pagination(20 , 10, 10 , 352);
pg.linkPage = "pagenum.jsp";
pg.queryString = "param1=test¶m2=test2";
// for design
pg.firstLink = "<img src=\"/first.gif\">";
pg.prevLink = "<img src=\"/prev.gif\">";
pg.nextLink = "<img src=\"/next.gif\">";
pg.lastLink = "<img src=\"/last.gif\">";
pg.delimiter = "|";
System.out.println(pg.print());
}
*/
}
[/code]
소스파일은 첨부~~
2010년 1월 28일 목요일
Windows에서 Ubuntu 9.10 로! #3
드디어 모든 설치를 완료하였습니다
그렇다면 가장 먼저 무엇을 해야 할까요?
음, 저의 경우에는 그래픽 드라이버를 설치하였습니다.
그래픽 드라이버의 경우 직접 제공 사이트에서 다운로드 받아 설치하셔도 되겠지만요 우분투에는 아주 편한 툴인 Envy라는 툴이 있습니다.
자동으로 그래픽 카드를 인식하고 최적의 드라이버를 설치하도록 해주죠.
1. 시냅틱 패키지 관리자를 열어야 합니다. 우분투를 사용하실 때 많은 어플리케이션을 다운로드 받을 텐데 그때 아주 유용하게 사용되어질 놈이니 잘 알아두어야 합니다.
상단의 왼쪽에서
시스템 -> 관리 -> 시냅틱 패키지 관리자
이렇게 실행을 시킵니다. 실행을 하게 되면 root 권한이 필요하여 암호를 물어보는데 로그인할 때 입력한 암호를 넣으시면 됩니다.(root 권한을 획득할 수 있는 계정이기 때문이죠~~)
2. 자~~ 저장소의 내용을 먼저 업데이트 해줘야 하죠. 새로 고침을 누르신 후 빠른 검색에서 envy 라고 치시면 다음과 같이 envyng 관련 패키지가 나옵니다. 여기서 envyng-gtk , core , qt를 모두 체크하여 설치해줍니다.

3. 자 그럼 이제 엔비를 통해서 그래픽 드라이버를 설치해야 겠군요. 엔비는 프로그램 -> 시스템 도구에 들어있습니다.
프로그램 -> 시스템 도구 -> EnvyNG

엔비를 실행하니 위 화면과 같이 나오는군요. Compatible과 Rocommended 에 모두 체크가 되어있는 드라이버를 선택하여 Apply 하시면 자동으로 그래픽 카드가 인스톨 됩니다.
자 그럼 리부팅을 한번 하지요.
4. 저의 경우에는 nvidia에 듀얼 모니터를 사용하고 있지요. 버그인지는 모르겠지만 드라이버를 모조리 설치하고 그래픽을 셋팅하려고 시스템 -> 관리 -> NVidia X Server Settings 를 실행하고 환경설정을 저장하려고 하면 이상한 에러문구가 뜨면서 저장이 안되더군요.
그래서 터미널에서 다음과 같이 xorg.conf 를 백업한뒤 설정 파일을 삭제하였습니다.
그런 다음 최고 관리자로 nvidia 컨트롤 패널을 띄웁니다.
5. 듀얼 모니터 셋팅

일단 모니터 2개를 연결했다 하더라도 서브 모니터는 disable 되어있는 습니다. 해당 모니터를 선택 한 후 Configure에서 Twin View로 옵션을 바꾸어 놓고 Save to X Configuration 을 눌러 설정 파일을 저장합니다. 이때 가끔 primary를 서브 모니터로 하는 경우도 있는데 이건 그냥 어떤걸로 할지 직접 체크하여 주시면 되겠습니다.
그런 다음 리부팅~~
6. 자~~ 듀얼이 잘 잡히는 군요.

참고로 저는 Geforce 8500 GT 입니다. 처음에 이 부분 때문에 저도 많이 삽질을 하였네요. 아무튼, xorg.conf 요놈이 문제였습니다.
참, 혹시라도 해당 설정에 문제가 있어 부팅시 화면이 깨져서 나온다면 궁여지책으로 backup 해둔 xorg.conf를 다시 원상 복구 시켜야 하겠네요.
그렇다면 가장 먼저 무엇을 해야 할까요?
음, 저의 경우에는 그래픽 드라이버를 설치하였습니다.
그래픽 드라이버의 경우 직접 제공 사이트에서 다운로드 받아 설치하셔도 되겠지만요 우분투에는 아주 편한 툴인 Envy라는 툴이 있습니다.
자동으로 그래픽 카드를 인식하고 최적의 드라이버를 설치하도록 해주죠.
1. 시냅틱 패키지 관리자를 열어야 합니다. 우분투를 사용하실 때 많은 어플리케이션을 다운로드 받을 텐데 그때 아주 유용하게 사용되어질 놈이니 잘 알아두어야 합니다.
상단의 왼쪽에서
시스템 -> 관리 -> 시냅틱 패키지 관리자
이렇게 실행을 시킵니다. 실행을 하게 되면 root 권한이 필요하여 암호를 물어보는데 로그인할 때 입력한 암호를 넣으시면 됩니다.(root 권한을 획득할 수 있는 계정이기 때문이죠~~)
2. 자~~ 저장소의 내용을 먼저 업데이트 해줘야 하죠. 새로 고침을 누르신 후 빠른 검색에서 envy 라고 치시면 다음과 같이 envyng 관련 패키지가 나옵니다. 여기서 envyng-gtk , core , qt를 모두 체크하여 설치해줍니다.

3. 자 그럼 이제 엔비를 통해서 그래픽 드라이버를 설치해야 겠군요. 엔비는 프로그램 -> 시스템 도구에 들어있습니다.
프로그램 -> 시스템 도구 -> EnvyNG

엔비를 실행하니 위 화면과 같이 나오는군요. Compatible과 Rocommended 에 모두 체크가 되어있는 드라이버를 선택하여 Apply 하시면 자동으로 그래픽 카드가 인스톨 됩니다.
자 그럼 리부팅을 한번 하지요.
4. 저의 경우에는 nvidia에 듀얼 모니터를 사용하고 있지요. 버그인지는 모르겠지만 드라이버를 모조리 설치하고 그래픽을 셋팅하려고 시스템 -> 관리 -> NVidia X Server Settings 를 실행하고 환경설정을 저장하려고 하면 이상한 에러문구가 뜨면서 저장이 안되더군요.
그래서 터미널에서 다음과 같이 xorg.conf 를 백업한뒤 설정 파일을 삭제하였습니다.
cd /etc/X11/xorg.conf
sudo mv xorg.conf xorg.conf.back
sudo mv xorg.conf xorg.conf.back
그런 다음 최고 관리자로 nvidia 컨트롤 패널을 띄웁니다.
sudo nvidia-settings
5. 듀얼 모니터 셋팅

일단 모니터 2개를 연결했다 하더라도 서브 모니터는 disable 되어있는 습니다. 해당 모니터를 선택 한 후 Configure에서 Twin View로 옵션을 바꾸어 놓고 Save to X Configuration 을 눌러 설정 파일을 저장합니다. 이때 가끔 primary를 서브 모니터로 하는 경우도 있는데 이건 그냥 어떤걸로 할지 직접 체크하여 주시면 되겠습니다.
그런 다음 리부팅~~
6. 자~~ 듀얼이 잘 잡히는 군요.

참고로 저는 Geforce 8500 GT 입니다. 처음에 이 부분 때문에 저도 많이 삽질을 하였네요. 아무튼, xorg.conf 요놈이 문제였습니다.
참, 혹시라도 해당 설정에 문제가 있어 부팅시 화면이 깨져서 나온다면 궁여지책으로 backup 해둔 xorg.conf를 다시 원상 복구 시켜야 하겠네요.
Windows에서 Ubuntu 9.10 로! #2
자 이제 Ubuntu 9.10 CD도 구했으니 설치를 해보도록 하지요.
우분투의 경우 요즘 나오는 리눅스 중에서는 그 설치과정이 너무나도 편하게 되어있어서 아마도 쉽게 하실 수 있을 것 같습니다.(다만 몇몇 하드웨어의 경우에는 안될 수도 있겠지요...)
1. CD로 (혹은 USB 이거나..) 부팅을 하게 되면 나오는 첫번째 화면입니다. 우리는 한글로 설정하도록 하지요.

2. 한국어를 선택하고 나면 다음과 같은 메뉴가 나타납니다.

특별히 메모리 테스트 및 디스크 결함 확인 등등 해보실 분은 하시면 되고요, 일단 여기서는 설치를 하려하니 우분투 설치로 가서 Enter!~
3. 언어 설정인데 워낙에 많은 언어를 지원하니...

아무튼, 우리는 한국어로 셋탕합니다.
4. 지역/시간대 설정이군요.

5. 이번에는 키보드 레이아웃 설정입니다. 그냥 대충하시면 안되고요, 국내 일반적인 컴퓨터의 경우 무난하게 다음 스샷과 같이 설정하시면 됩니다.

키보드 레이아웃을 잘못 선택하게 되면 나중에 골치가 아프죠.....
6. 다음은 설치할 파티션을 조정합니다.

- 나란히 설치하고, 시작할 때 선택하기
기존의 OS를 그대로 놔둡니다. 그리고 뒤에 남은 공간에 설치하려고 하지요. 현재의 OS를 지우지 않고 멀티부팅하실꺼라면 이 옵션을 선택하셔야 합니다.
- 이전 파티션을 삭제하고 디스크 전체 사용
한마디로 디스크 몽땅 날리고 새로 설치한다는 것이지요. 여기서는 요 옵션을 선택하였습니다.
- 수동 파티션 조정
수동으로 파티션을 조정하는 것이죠. 수동으로 하시게 되면 각각의 로지컬로 구분을 하여 다양하게 자원을 관리할 수 있습니다. 물론 파일시스템도 바꿀 수도 있고요. 일단 9.10에서는 EXT4가 디폴트 입니다. 참 스왑영역의 경우에는 보통 램 크기 * 2 사이즈로 잡아줍니다. 나머지는 입맛에 맞게 ...
7. 계정 등록이네요.

계정을 등록해주세요. 참, 8자리 미만의 암호는 경고창이 나오는데 그냥 살포시 무시하셔도 됩니다~
8. 설치 준비 확인

별거 없습니다. 현재까지 지정한 내용이 맞는지 다시 한번 확인 후 설치를 누르게 되면 바로 설치가 되지요.
9. 설치중이군요..

자 이제 설치가 끝났습니다. 설치가 끝나면 CD-ROM 에서 CD를 빼고 리부팅 합니다. 그럼 이제 우분투가 완전히 설치가 된 것이죠~~~
우분투의 경우 요즘 나오는 리눅스 중에서는 그 설치과정이 너무나도 편하게 되어있어서 아마도 쉽게 하실 수 있을 것 같습니다.(다만 몇몇 하드웨어의 경우에는 안될 수도 있겠지요...)
1. CD로 (혹은 USB 이거나..) 부팅을 하게 되면 나오는 첫번째 화면입니다. 우리는 한글로 설정하도록 하지요.

2. 한국어를 선택하고 나면 다음과 같은 메뉴가 나타납니다.

특별히 메모리 테스트 및 디스크 결함 확인 등등 해보실 분은 하시면 되고요, 일단 여기서는 설치를 하려하니 우분투 설치로 가서 Enter!~
3. 언어 설정인데 워낙에 많은 언어를 지원하니...

아무튼, 우리는 한국어로 셋탕합니다.
4. 지역/시간대 설정이군요.

5. 이번에는 키보드 레이아웃 설정입니다. 그냥 대충하시면 안되고요, 국내 일반적인 컴퓨터의 경우 무난하게 다음 스샷과 같이 설정하시면 됩니다.

키보드 레이아웃을 잘못 선택하게 되면 나중에 골치가 아프죠.....
6. 다음은 설치할 파티션을 조정합니다.

- 나란히 설치하고, 시작할 때 선택하기
기존의 OS를 그대로 놔둡니다. 그리고 뒤에 남은 공간에 설치하려고 하지요. 현재의 OS를 지우지 않고 멀티부팅하실꺼라면 이 옵션을 선택하셔야 합니다.
- 이전 파티션을 삭제하고 디스크 전체 사용
한마디로 디스크 몽땅 날리고 새로 설치한다는 것이지요. 여기서는 요 옵션을 선택하였습니다.
- 수동 파티션 조정
수동으로 파티션을 조정하는 것이죠. 수동으로 하시게 되면 각각의 로지컬로 구분을 하여 다양하게 자원을 관리할 수 있습니다. 물론 파일시스템도 바꿀 수도 있고요. 일단 9.10에서는 EXT4가 디폴트 입니다. 참 스왑영역의 경우에는 보통 램 크기 * 2 사이즈로 잡아줍니다. 나머지는 입맛에 맞게 ...
펼쳐두기..
수동 파티션의 경우 이견이 너무나 많더군요.
어차피 자기 입맛에 맞게 조정하려다보니 정석이란게 없겠지요. 필요에 의하여 나누어주는 것이니깐요.
보통 여러 부분으로 로지컬 파티션으로 분리하는 이유는 몇가지 어드벤티지를 누리기 위해서인데요, 이를 테면 /home을 분리하고 시스템을 다시 갈아 엎어버린다... 할때 / 와 /home 부분을 나누어주게 되면 /home안에 있는 데이타는 살아있게 되는 것이죠. 뭐... Windows에서 C, D, E 이렇게 파티션 나누는것과 비슷하다고 보시면 됩니다.
하지만 제대로된 용량 배분을 하지 못한다면 사용중에 치명적인 결과에 직면할 수도 있으니 이 부분은 많은 정보를 확인 후 하시기 바랍니다.
어차피 자기 입맛에 맞게 조정하려다보니 정석이란게 없겠지요. 필요에 의하여 나누어주는 것이니깐요.
보통 여러 부분으로 로지컬 파티션으로 분리하는 이유는 몇가지 어드벤티지를 누리기 위해서인데요, 이를 테면 /home을 분리하고 시스템을 다시 갈아 엎어버린다... 할때 / 와 /home 부분을 나누어주게 되면 /home안에 있는 데이타는 살아있게 되는 것이죠. 뭐... Windows에서 C, D, E 이렇게 파티션 나누는것과 비슷하다고 보시면 됩니다.
하지만 제대로된 용량 배분을 하지 못한다면 사용중에 치명적인 결과에 직면할 수도 있으니 이 부분은 많은 정보를 확인 후 하시기 바랍니다.
7. 계정 등록이네요.

계정을 등록해주세요. 참, 8자리 미만의 암호는 경고창이 나오는데 그냥 살포시 무시하셔도 됩니다~
8. 설치 준비 확인

별거 없습니다. 현재까지 지정한 내용이 맞는지 다시 한번 확인 후 설치를 누르게 되면 바로 설치가 되지요.
9. 설치중이군요..

자 이제 설치가 끝났습니다. 설치가 끝나면 CD-ROM 에서 CD를 빼고 리부팅 합니다. 그럼 이제 우분투가 완전히 설치가 된 것이죠~~~
2010년 1월 27일 수요일
Windows에서 Ubuntu 9.10 로! #1
오늘부터 조금씩 Windows에서 Ubuntu로 OS를 갈아타는 과정을 블로깅 하려 합니다.
Ubuntu 버전은 9.10(현재 최신 릴리즈 버전) 이며 구하실 곳은 다음과 같습니다.
http://www.ubuntu.com/getubuntu/download
Ubuntu 버전은 9.10(현재 최신 릴리즈 버전) 이며 구하실 곳은 다음과 같습니다.
http://www.ubuntu.com/getubuntu/download
참고로 x86 , x64 사이에서 고민하시는 분들이 있을텐데요, 글쎄요... 여러 벤치마킹 사이트 결과 64비트버전이 성능이 탁월하게 나와있었는데 실제 제가 경험해본 결과로는 뭐.. 32비트나 64비트나 그게 그거인것 같더군요. 오히려 몇가지 라이브러리 설치시 64비트에서는 쪼꼼~~ 잔손이 가는 부분이 있어서 일단 그냥 사용하시기에는 아직은 32비트가 좋지 않을가 합니다.

국가 설정하는 곳 하단에 보시면 Alternative download options 가 있는데요 클릭하시게 되면 8.04 LTS 선택, 32 , 64 비트 선택 화면이 나옵니다.
다운로드 받으신 후에 CD로 구우시면 됩니다.
CD 구우실 때 ImageBurn 이라고 아주 좋은 툴이 있지요(게다가 무료!)
http://www.imgburn.com/index.php?act=download 여기에서 다운로드 받으시면 됩니다.
참고로 usb에서 인스톨 할 수도 있는데요 뭐 그건 각자 선택사항으로 맡기겠습니다.

Ubuntu FireFox 3.5.7 주소창 포커스 되면 전체 선택하기
윈도우와는 다르게 우분투에서 파이어폭스주소창에 포커싱이 되면 주소 모두가 전체 선택이 안되어진다.
윈도우를 한참을 쓰다가 우분투로 갈아탄터라 아주 사소한 부분이지만 나로써는 굉장히 불편한 부분이였다.
윈도우에서와 같이 주소창 포커싱시에 전체 주소가 선택되는 기능을 설정하기는 매루 간단하다
파이어폭스 주소창에 다음과 같이 입력하고 엔터
그러면 고급설정을 할 수가 있는데 여기서
browser.backspace_action
의 값을 0 으로 바꿔주자.
윈도우를 한참을 쓰다가 우분투로 갈아탄터라 아주 사소한 부분이지만 나로써는 굉장히 불편한 부분이였다.
윈도우에서와 같이 주소창 포커싱시에 전체 주소가 선택되는 기능을 설정하기는 매루 간단하다
파이어폭스 주소창에 다음과 같이 입력하고 엔터
about:config
그러면 고급설정을 할 수가 있는데 여기서
browser.backspace_action
의 값을 0 으로 바꿔주자.
2010년 1월 21일 목요일
Ubuntu에서 Apache 2.2 + PHP 5.2 + MySQL 5 설치
:: Ubuntu Server 8.04 LTS 버전 하에서 작성된 것입니다.
1. Apache2와 PHP5를 설치
2. MySQL 5 설치
3. 서버 시작 및 설정
위와 같이 설치하게 되면 일단 서버는 무조건 시작된 상태이다.
각 서버는 다음과 같은 명령으로 시작,중지,재시작을 할 수 있다.
Apache 설정 관련 파일
MySQL 설정 파일
PHP 설정 파일
1. Apache2와 PHP5를 설치
sudo apt-get install apache2
sudo apt-get install php5
sudo apt-get install libapache2-mod-php5
sudo apt-get install php5
sudo apt-get install libapache2-mod-php5
2. MySQL 5 설치
sudo apt-get install mysql-server mysql-client
sudo apt-get install php5-mysql
sudo apt-get install php5-mysql
3. 서버 시작 및 설정
위와 같이 설치하게 되면 일단 서버는 무조건 시작된 상태이다.
각 서버는 다음과 같은 명령으로 시작,중지,재시작을 할 수 있다.
Apache 서비스 관련
sudo /etc/init.d/apache2 start (서버 시작)
sudo /etc/init.d/apache2 stop (서버 중지)
sudo /etc/init.d/apache2 restart (서버 재시작)
MySQL 서비스 관련sudo /etc/init.d/apache2 stop (서버 중지)
sudo /etc/init.d/apache2 restart (서버 재시작)
sudo /etc/init.d/mysql start (서버 시작)
sudo /etc/init.d/mysql stop (서버 중지)
sudo /etc/init.d/mysql restart (서버 재시작)
sudo /etc/init.d/mysql stop (서버 중지)
sudo /etc/init.d/mysql restart (서버 재시작)
Apache 설정 관련 파일
/etc/apache2/apache2.conf
/etc/apache2/sites-enabled
아파치의 주설정 파일입니다. 일전에 Ubuntu Server Administrator 관련된 서적에서 보니 해당 파일은 왠만하면 만지지 말라고 하더군요. 하지만 몇가지 튜닝 관련하여(뭐 바이너리라 튜닝에 많은 제한이 있긴 하지만...)설정 하시려면 해당 파일에서 설정해야 합니다. 서버의 기본적인 기능에 대한 설정이 있으니깐요
/etc/apache2/httpd.conf이놈은 디폴트로는 아무런 값도 없습니다. Ubuntu Server 관련 서적에서는 설정할 것이 있으면 이 파일에 설정을 하라고 하더군요.
/etc/apache2/sites-available이곳은 가상호스트를 설정하는 원본 파일이 있는 곳입니다. 눈치 빠르신 분은 벌써 이해하셨겠지만 우분투에서 가상 호스트 지원에 대한 파일관리를 좀 쉽게 하기 위해서 각각의 가상 호스트를 이곳에 먼저 저장하고(예를 들어 devel.test.co.kr에 대한 가상 호스트라면 devel.test.co.kr.vhost 라는 파일을 만드는 것이죠) 해당 호스트를 enable 시키려면 sites-enabled로 심볼릭 링크를 걸어주는 것이죠. 뭐 그닥 필요한 부분은 아님...
/etc/apache2/sites-enabled
여기에는 디폴트로 가상 호스트를 설정하는 파일이 있습니다. sites-available에 있는 파일에 대한 심볼릭 링크입니다. 이곳에 파일이 있어야 실제적으로 가상호스트가 올바르게 올라갑니다. 제가 똑같은 서버 인데 8.04 64bit를 두군데 설치하였는데요. 이상하게 한군데는 000-default 파일만 읽어오고 한군데는 이 폴더 안에 있는 모든 파일을 읽어들이더군요. apache2.conf에 하단에 보시면 include 시키는 부분에서 지정을 해주긴 하지만요.
/etc/apache2/mods-available아파치에서 사용할 수 있는 모듈들이 있는 곳입니다. 보통 .load , .conf 로 있습니다.
/etc/apache2/mods-enabled실제적으로 사용할 모듈을 심볼릭 링크로 걸어주는 곳이죠. 이는 앞서 설명한 가상 호스트와 동일하게 이해하시면 됩니다.
MySQL 설정 파일
/etc/mysql/my.cnf
mysql 설정 파일입니다. 보통 디폴트로 깔리면 latin1으로 케릭터 셋이 잡히는데 상당히 짜증나죠.. ㅋㅋㅋ 이곳에서 케릭터 설정 및 튜닝 등등을 하고 mysql을 재시작~~
PHP 설정 파일
/etc/php5/apache2/php.ini
php도 나름 입맛에 맞게 설정해야 할 때 이 파일을 건들여주세요.
피드 구독하기:
글 (Atom)
Pagination.java