May 302013
 

sar(System Activity Reporter)는 리눅스의 CPU 사용률, 메모리 사용률 따위의 정보를 알아내는대에 쓰이는 프로그램이다. 물론 모니터링에도 쓸 수 있다.

centos에서 이 프로그램은 ” yum install sysstat “를 통하여 설치할 수 있다.

사용법은 다음과 같다. /etc/cron.d/sysstat 에 등록된 정보에 따라서 로그를 지정된 파일에 저장시킨다.

처음 설치 후 실행을 위해서 ” service sysstat restart ” 명령을 통해 가능하다. ” chkconfig –add sysstat “를 통하여 재부팅 후에도 자동으로 실행되게 할 수 있다.

” sar -A -o <<파일명>>  <<반복|초>> <<반복횟수>> “을 통하여 파일에 로그를 저장한다. (-A는 모든 정보를 저장하는 옵션인데 자세한 것은 Oracle sar 설명[1]을 참조)

나중에 생성된 파일에서 정보를 다시 확인하는 방법은 ” sar -A -f <<파일명>> ” 을 통하여 가능하다.

 

[1] 시스템 작업 모니터링(sar) – Oracle(2013-05-30 01:56 KST 확인),  http://docs.oracle.com/cd/E24846_01/html/E23088/spmonitor-8.html

[2] http://www.welog.net/gbbs/bbs/board.php?bo_table=linux&wr_id=2

May 252013
 

2TB 이상의 하드디스크를 이용하여 리눅스에서 기존의 방법(fdisk)을 통해 파티션을 생성할 경우 무조건 2TB로만 만들어 지는 문제가 있다.

2TB이상의 파티션을 만들기 위해 아래의 방법을 이용하면 된다.

parted /dev/sdb     (/dev/sdb 는 상황에 맞추어 바꿀 것)
mklabel gpt
unit TB
mkpart primary 0.00TB 4.00TB
print
quit

cap_1

* 경고(책임의 한계) : 이 작업을 통하여 어떠한 일이 발생하더라도 책임을 지지 않습니다. 작업의 결과는 이 작업을 수행한 본인에게 책임이 있습니다.

May 212013
 

인터넷 영상 스트리밍 클라이언트를 웹에서 구현하기 위해서는 여러 가지 방법을 이용할 수 있다. 그 중에서 Flash를 이용하여 많이 구현을 한다. 그 이유는 대부분의 브라우져에서 Flash를 지원하며, 빠른 구현이 가능하고, 영상 스트리밍과 관련된 많은 기능을 지원하기 때문이다. Flash에서 스트리밍을 위해 많이 사용하는 프로토콜은 RTMP라고 하는 것이 있다. RTMP는 Macromedia에서 영상 스트리밍 전송을 위해 만든 기술로써 이를 지원하는 서버가 많이 존재한다.

Flash는 보안과 관련하여 많은 고민을 하여 만들어 졌는데, 이 중 하나가 RTMP에서 들어온 음성 스트림에 대한 샘플 데이터에 대한 보안이다. 샘플 데이터는 SoundMixer라는 클래스의 computeSpectrum()이라는 함수[1]를 이용하여 알아낼 수 있다. 서버에서 허가를 하지 않으면 RTMP에서 들어온 음성 스트림 샘플을 이용할 수 없게 된다.  소리가 나오는데 computeSpectrum()의 결과값이 ‘0’으로만 채워져서 리턴되는 것이다.  이 포스팅에서는 이를 WowzaMediaServer에서 어떻게 해결하는지를 알아 본다.

방법은 간단하다. WowzaMediaServer 설치 디렉토리 밑의 conf 디렉토리에서 설정을 바꾸고 싶은 어플리케이션(Application)의 Application.xml 파일을 변경하면 된다. Root->Application->Client->Access->StreamAudioSampleAccess 설정에 *를 표시하면 이 문제가 해결된다 [2]. 이 문제는 crossdomain.xml[3]과 관련된 문제와는 별게의 것으로 알려져 있다.

<Client>
     <IdleFrequency>-1</IdleFrequency>
     <Access>
          <StreamReadAccess>*</StreamReadAccess>
          <StreamWriteAccess>*</StreamWriteAccess>
          <StreamAudioSampleAccess>*</StreamAudioSampleAccess>  <!-- 이부분 수정 -->
          <StreamVideoSampleAccess></StreamVideoSampleAccess>
          <SharedObjectReadAccess>*</SharedObjectReadAccess>
          <SharedObjectWriteAccess>*</SharedObjectWriteAccess>
     </Access>
</Client>

참고 자료

[1] SoundMixer 클래스(2013-05-21 02:02 KST에 확인),  http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/SoundMixer.html

[2] Example of how to use ComputeSpectrum with Wowza Media Server(2013-05-21 02:23 KST에 확인), http://www.wowza.com/forums/content.php?56-Example-of-how-to-use-ComputeSpectrum-with-Wowza-Media-Server

[3] Cross-domain policy for Flash movies(2013-05-21 02:23 KST에 확인),  http://kb2.adobe.com/cps/142/tn_14213.html

Apr 072012
 

미로 최단거리 문제 – 프로그래밍 콘테스트 챌린징 책 P50 문제

 

너비 우선 탐색을 통해 문제를 풀음.

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

class Save
{
	public int x;
	public int y;
	public int num;

	public Save(int x, int y, int num
	{
		this.x = x;
		this.y = y;
		this.num = num;
	}
}

public class Miro {

	public static void main(String[] args) {
		int x, y;
		int num = 0;
		int start_x = 0;
		int start_y = 0;
		int[][] arr = new int[102][102];
		Queue<Save> queue = new LinkedList<Save>();
		Scanner scan = new Scanner(System.in);

		x = scan.nextInt();
		y = scan.nextInt();

		for (int i = 0; i <= x + 1; i++) {
			for (int j = 0; j <= y + 1; j++)
			{
				arr[i][j] = -100;
			}
		}

		for (int i = 1; i <= x; i++)
		{
			char[] tmp = scan.next().toCharArray();

			for (int j = 0; j < y; j++)
			{
				if (tmp[j] == 'S')
				{
					start_x = i;
					start_y = j + 1;
				}
				else if (tmp[j] == '.')
				{
					arr[i][j + 1] = 0;
				}
				else if (tmp[j] == 'G')
				{
					arr[i][j + 1] = Integer.MAX_VALUE;
				}
			}
		}

		queue.add(new Save(start_x, start_y, num));

		while (!queue.isEmpty())
		{
			Save now = queue.poll();
			num = ++now.num;

			if (arr[now.x][now.y] == Integer.MAX_VALUE)
			{
				break;
			}

			arr[now.x][now.y] = now.num;

			if (arr[now.x - 1][now.y] == 0)
			{
				queue.add(new Save(now.x - 1, now.y, now.num));
			}
			if (arr[now.x][now.y - 1] == 0)
			{
				queue.add(new Save(now.x, now.y - 1, now.num));
			}
			if (arr[now.x + 1][now.y] == 0)
			{
				queue.add(new Save(now.x + 1, now.y, now.num));
			}
			if (arr[now.x][now.y + 1] == 0)
			{
				queue.add(new Save(now.x, now.y + 1, now.num));
			}
		}
		System.out.println(num);
	}
}

 

Apr 072012
 

 

Lake Counting (POJ No.2386)

 

재귀 함수를 이용하여 구현하였다.

import java.util.Scanner;

public class P2386 {

	public static int[][] arr = new int[102][102];

	public static void check(int x, int y, int num) {

		arr[x][y] = num;

		if (arr[x - 1][y] == 0)
			check(x - 1, y, num);

		if (arr[x + 1][y] == 0)
			check(x + 1, y, num);

		if (arr[x - 1][y - 1] == 0)
			check(x - 1, y - 1, num);

		if (arr[x][y - 1] == 0)
			check(x, y - 1, num);

		if (arr[x + 1][y - 1] == 0)
			check(x + 1, y - 1, num);

		if (arr[x - 1][y + 1] == 0)
			check(x - 1, y + 1, num);

		if (arr[x][y + 1] == 0)
			check(x, y + 1, num);

		if (arr[x + 1][y + 1] == 0)
			check(x + 1, y + 1, num);

	}

	public static void main(String[] args) {

		int x, y;
		int num = 0;
		Scanner scan = new Scanner(System.in);

		x = scan.nextInt();
		y = scan.nextInt();

		for (int i = 0; i <= x + 1; i++)
		{
			for (int j = 0; j <= y + 1; j++)
			{
				arr[i][j] = -1;
			}
		}

		for (int i = 1; i <= x; i++)
		{
			char[] tmp = scan.next().toCharArray();

			for (int j = 0; j < y; j++)
			{
				if (tmp[j] == 'W')
				{
					arr[i][j + 1] = 0;
				}
			}
		}

		for (int i = 1; i <= x; i++)
		{
			for (int j = 1; j <= y; j++)
			{
				if (arr[i][j] == 0)
				{
					check(i, j, ++num);
				}
			}
		}

		System.out.println(num);
	}
}

 

Apr 042012
 

개미가 부디칠 경우 통과한다고 보고 작성.,

 

속도는 O(n)

import java.util.Scanner;

public class P1852 {

	/**
	 * @param args
	 */

	public static void main(String[] args) {
		int testcase;
		Scanner scan = new Scanner(System.in);

		testcase = scan.nextInt();

		while (testcase– > 0)
		{
			int l = scan.nextInt();
			int n = scan.nextInt();

			int max = 0;
			int min = 0;

			for (int i=0; i<n; i++)
			{
				int t = scan.nextInt();

				max = Math.max(max, Math.max(l-t, t));
				min = Math.max(min, Math.min(l-t, t));
			}

			System.out.println(min + ” ” + max);
		}
	}
}

 

Dec 312011
 

  정말 이런 저런 여러가지 일이 있었다. 뭐.. 매년 안그렇겠는가? 매년 여러가지 일이 있었다.

  사실 우리가 사용하고 있는 ‘양력’이라든지 ‘음력’과 같은 것도 편의상 만든 것에 불과하다. 물론 양력과 같은 경우 지구의 공전주기를 이용하여 만들어 졌고, 음력과 같은 경우 달을 이용하여 만들어진 것 뿐이다. 물론 음력과 같은 경우 이용할 만한 부분이 밀물,썰물 시기를 알아내는데 밖에 쓰이지 못하기 때문에(달의 이동과 공전주기는 한번 생각해볼 문제다) 계절에 맞추기 위해서 윤달과 같은 복잡한 것을 사용했다 [1]. 음력을 이용하고 있었던 것을 고종 대에 양력을 이용하기 시작함에 따라 바뀌게 된 것이다. 뭐 내 생각이지만, 양력을 더 쓰는 이유는 서양 중심이라는 이유와 달(Month)과 계절이 직접적으로 매치가 되는 양력이 더 우세했으니 쓰였을 것이라고 생각하지만 말이다.

  마찬가지로 AD(서기)나 BC(기원전)이나 단기(2333+AD)나 쇼와xx년 과 같은 경우도 다 비슷한 것이 아닌가? 에티오피아와 같은 경우 완전 다른 달력 시스템을 사용한다 [2].

  12월 25일이 성탄절, 부처님 오신날, 부활절 같은 건 사실 사람이 만든 것이 아닌가? 신은 없을태지만 있다고 가정했을 때, 누구 마음대로 신의 생일을 논한단 말인가? 

  마찬가지로 7일을 한 주로 정한 것은 무엇인가? 이 것도 결론은 사람이 만든 것이다. 종교적 때로는 효율, 다른 국가가 하니까 따라하기 등등의 방법을 통해 7일을 결정한 것이다. 우리가 사용하고 있는 그레고리력에서 1582년 10월 4일 다음날이 1582년 10월 15일인 것을 알고 있는가 [3]? 그러면 그 자랑스럽다는 성탄절은 어떻게 되는건가? 부활절은 어떻게 되는건가?

  여러분은 사람이 만든 것에 너무 끌려다니시지는 않으십니까? 60년 마다 중국식 년도가 돌아오는 건 아십니까(갑자, 을축, 병인, 정묘, …)? 한주가 9일인 경우, 1년에 4개월 밖에 없는 경우를 상상해 보신적은 있으십니까? 사실 지금이 12월 31일이 아니고 5월 31일이라고 생각해 보십시오. 고정관념을 깨면 더 넓게 생각할 수 있습니다.

TED 동영상 추천 드립니다. 쥴리아 스위니의 “하느님을 보내드리기 (내가 느끼는 하느님)”


   
[1] 한국 민족 문화 대백과, “달력”, 네이버 사전.
[2] 위키피디아 한국어판, “에티오피아력”,http://ko.wikipedia.org/wiki/에티오피아력
[3] 위키피디아 한국어판, “그레고리력”, http://ko.wikipedia.org/wiki/그레고리력

Nov 062011
 

  Q.E.D 증명종료라는 만화를 보면서 판사,검사,변호사가 이어가는 이야기를 보았다. 꽤 재미있는 이야기였다. 피의자는 자신의 무죄를 증명할 필요가 없으며, 오직 유죄임을 증명해야하는 것은 검사라는 것이였다. 그리고 배심원제 이야기가 나왔는데 이는 배심원이 피의자나 거기서 이야기하는 사람들에 의해 선동될 수 있다는 점도 꽤 흥미로웠다. 어떻게 보면 당연하기도 하고… 

  문득 떠올랐다. CS를 하는 나로써는 뭐던 컴퓨터로 만들어 버리고 싶다는 생각을 하는데 이런 제판이나 프로세스를 컴퓨터로만들어버리면 재미있을 것 같다는 생각이 들었다. 판단을 사람이 내리는 것이 아니고 기계가 내리는 것이다. 뭐 대신 컴퓨터가 판결해주는 것은 어려운 문제라서 실제로 만들기는 힘들 것이다. 하지만 만약 가능하다고 가정하고 컴퓨터가 판결결과를 내려주는 세계에 대한 이야기를 쓰면 재미있을 것 같다. 모든 상황에 대해서 컴퓨터에다가 입력하고 반대의견을 입력한 다음에 돌리는 것이다. 그러면 결과가 나오는거다. 법정보까지 다 입력 되어있기 때문에 법리에대한 결과가 신뢰할만 하다고 해보자. 에러가 없어서 이 프로그램은 완전하다고 해보자. 컴퓨터는 어차피 기계일 뿐이니까 정(情)과 같은 요소는 배제하고 결과를 낼것이다. 언제나 기계의 판단은 올바르고 정확하다. 억울하게 무죄가 될 일은 없다. 입력을 잘 못하였거나 조사가 부족한 것이 없다면 확실하게 결과값을 출력할태니까 말이다. 그런데 거기까지가면 기계의 세상이지 사람의 세상이 아닐 것 같다는 생각이 든다. 민주사회에서 잘잘못을 판별하는 곳의 일을 기계에 맞겼다는 것은 기계에게 조정당하는 사회라는 생각이 들었다.