id는 유저의 id이고 x는 비밀번호를 shadow에 암호화하여 저장했다는 뜻이다. 뒤에 숫자가 2개 보이는데 첫번째 숫자는 유저의 UID이다. 뒤의 숫자는 GID인데 Group을 나타낸다. 뒤에 ,,, 는 사용자 정보인데 입력하지 않으면 저렇게 보인다. 뒤는 홈의 위치와 bash의 위치이다.
2. group
id : x : 1001 :
위와 마찬가지인데 숫자는 각 group ID를 나타낸다. GID가 겹치게 되면 같은 Group으로 볼 수 있는데 보통 리눅스에서 유저들은 각자 달은 GID를 가지고 있다. 어떻게 GID를 운영하는게 좋은지 공부해봐야 알듯.
gcc로 컴파일해서 열심히 프로그램을 돌리다보면 Segmentation Fault가 나는 경우가 있다. 보통 배열에 접근할 때나 포인터를 넘길 때 잘못하면 이런 문제가 생기는데 보통 for문 등 루프에서 배열에 접근할 때의 조건을 잘 보면 해결된다. 그런데도... Segmentation Fault가 해결이 안된다면 Valgrind를 사용해보자.
우분투의 경우 apt-get install valgrind 를 이용해 설치하면 되며 이외에는 valgrind.org에서 다운로드 받아 설치하면 될 것 같다.. (우분투만 써봐서요...ㅎㅎ)
설치 후 컴파일에서 옵션을 주어야 하는데 -g를 꼭 넣어줘야 한다.
Valgrind의 옵션은 꽤 다양해서 Valgrind --help를 입력해 옵션의 설명을 보는 것도 유용하다. 그래도... 귀찮다면
이외에도 윈도우에서는 UTF-8로 기본 저장하지 않기 때문에 가끔 문제를 일으키기도 합니다.
하지만 리눅스에선 간단히 파일의 인코딩과 속성을 바꿀 수 있어요.
우선 파일의 속성을 살펴보기 위해 다음과 같이 입력합니다.
file test.txt
만약 도스에서 편집된 파일이면 다음과 같이 나옵니다.
test.txt: ISO-8859 text, with CRLF line terminators
이제 파일을 변환해주기 위해 다음과 같이 명령어를 입력합니다.
dos2unix test.txt
만약 dos2unix 가 설치되어 있지 않다면....
sudo apt-get install dos2unix 로 설치해주세요. ^^ 이제 file test.txt 를 다시 입력해 상태를 확입합니다.
test.txt: ISO-8859 text
이제 인코딩을 바꾸어줄 순서인데요. iconv 라는 명령어와 recode 라는 명령어 두개가 있습니다. recode의 경우 *.txt를 지원해서 참 편리하지만... 이상하게도 제가 가지고 있던 파일에선 UTF-8로 변환시 한글이 왕창 깨지더군요..ㅠㅠ 저는 iconv로 변환했을 때 한글이 깨지지 않았습니다.
iconv -f EUC-KR -t UTF-8 test.txt > test.txt1
위와 같이 입력해주는데 처음에는 현재 인코딩을, 두번째에는 원하는 인코딩을 쓰시면 됩니다. *.txt를 지원하지 않기 때문에 배치파일을 만들어서 쓰시거나 노가다를 좀 해주시면 됩니다... (라고 무책임하게 말하기ㅡ.ㅡㅋㅋ)
다시 file 명령어를 이용해 속성을 확인해보면,
test.txt: UTF-8 Unicode text
그리고 vi를 이용해 한글이 깨졌는지 확인해보면...! 깨지지 않았죠? (전 안깨졌어요...ㅋ)
많은 파일을 쉽게 변환하는 팁을 알려드리면... 결과파일의 파일이름을 쓸 때 확장자를 조금만 바꾸어주세요. 우분투의 경우 rename 이라는 명령어(별도로 설치하셔야합니다.)를 이용해 간단히 바꿀 수 있어요.
복소평면에서 Newton's Method를 이용해 Z^3-1=0의 해를 찾는 건데요. 임의의 점(x,y)에서 뉴턴 메서드를 사용해 해를 찾을 때 세가지 해 중 한가지 해를 찾게 됩니다. 물론 복소평면에서 말이지요. 세가지 해를 각각 R, G, B로 점을 정해놓고 복소평면의 구간의 점들에 대해 모두 해를 찾아줍니다.
그럼 프랙탈 모양이 나온다고 합니다. 물론 메스메티카나 매트랩으로 그리는 방법은 찾기가 쉬우니... 그리고 그리기도 쉽죠? ㅋㅋ(그러나 전 안그려봤음...)
전산물리 숙제이기에 C로 만들어 보았습니다.
코딩하기 전에 복소평면을 실평면에서 그릴 수 있게 허수부와 실수부를 나누는 작업도 해야 합니다. 아래에 뉴턴 메서드에 맞게 계산한 결과가 있습니다.
복소평면에서 Z^3-1=0의 해를 구하기 위해 실수부와 허수부를 나누는 작업을 하자.
뉴턴 메서드(Newton Method)를 이용하기 때문에 이에 맞추어 계산을 한다.
여기서 이므로 위에 대입하여 미분을 해주면 된다.
복소평면의 미분은 일반 미분과 똑같은데 되는 조건이 있다. 자세한 내용은 수리물리학 책을 찾아보시라..
프로그래밍을 위해서는 복소평면을 실평면으로 가져와야 한다. 그래서 실수부와 허수부를 나누는 작업을 한다...ㅠ
분모에 복소수가 들어가있으니 보기가 좋지 않다. (응??ㅋㅋ) 그래서 켤레복소수를 곱해주자.
이제 남은 일은 Z=x + yi 로 나누어서 대입한 후 계산해주는 것 뿐이다. 간단한 노가다이니 대충 풀면
이제 실수부와 허수부를 나누어주자.
음... 이제 이 식을 와일 루프에 넣고 열심히 돌리면 해가 나온다.
이제 코딩을 열라 하면 됩니다. 제가 고치고 고쳐서 만든 프로그램은 다음과 같습니다.
./fractal.out x1 y1 x2 y2
이렇게 순서대로 인수를 입력합니다. 그럼 (x1, y1)에서부터 (x2, y2)까지의 범위에서 적절한 해상도로 점을 찍어가며 계산합니다. 이렇게 입력하고 난 뒤에는 di, 즉 해상도가 나옵니다.
그리고 데이터파일 3개에 각각의 근에 해당하는 좌표들을 저장합니다.
여기서 문제가 생기는데.... 허수부가 0이고 실수가 1인 해의 처리입니다. 해를 코드에서 판별할 때 허수부가 0인지 0보다 큰지 또는 작은지로 판단하는데 1의 근에서 허수부가 정확한 0이 아니라 0.00000000001 이런 값을 가질 수도 있더군요.. 컴퓨터로 계산하다보니 그런 것 같습니다... 그래서 작은 범위를 주어 0 근처의 값을 가지면 무조건 0으로 분기시킵니다.
그냥 빌게이츠 아저씨의 Visual Studio 6.0을 깔아서 쓰려고 했습니다. 그런데... 왠지 뽀대도 안나고 gcc 컴파일러를 꼭 써보고 싶다는 욕구가 들더라구요.. 대부분 연구실에서 리눅스를 쓰기도 하구요..
근데 리눅스를 써서 프로그래밍을 배우기엔... 너무 시간이 벅찬 관계로 윈도우에서 gcc를 돌리는 방법을 찾았습니다. 그러니 MinGW라는 프로그램이 나오더라구요. ㅋㅋ 물론! Linux + gcc 조합에 비해선 부족하다고 하지만 입문엔 이만한 툴도 없을까 싶어서 낼름 설치했습니다.
그리고 IDE(뭐 대충... 프로그래밍을 편하게 해주는 나모웹에디터 같은 존재라네요.)로는 인터넷을 뒤지다가 SUN의 이클립스(Ecliplse)를 쓰기로 했습니다.
장장 한시간 반동안 삽질해서 간신히 성공했네요...ㅋㅋ
첨에 에러가 계속 떠서 당황했는데 알고보니... 저장하고 컴파일하면 되는 것이었습니다. ㅡ.ㅡ
저장안하고 컴파일하면 에러나네요 ㅋㅋㅋ
방법이야 구글링을 하거나 네이버에 묻거나 하면 다 나오지만... 간단히 저도 메모를 합니다.