80% of the lifetime cost of a piece of software goes to maintenance.
Hardly any software is maintained for its whole life by the original author.
Code conventions improve the readability of the software, allowing engineers to understand new code more quickly and thoroughly.
소프트웨어를 개발하는 일련의 모든 과정에 들어가는 비용 중 80%가 유지보수에 쓰여진다.
소프트웨어의 유지보수를 그 소프트웨어를 직접 개발한 개발자가 담당하는 경우는 거의 보기 힘들다. 코드 규칙을 지키면 다른 개발자가 그 소스코드를 처음 보았을 때, 더 빠른 시간안에 완벽하게 이해할 수 있도록 도와주기 때문에, 소프트웨어의 가독성이 높아진다.
Shell 상에서 'export $PATH' 라고 입력하면 현재의 패스가 걸린 디렉토리가 전부 출력된다 혹은, 'export' 를 치면 전체 시스템상의 설정들 출력해 볼 수 있다.
2. 그럼 패스가 걸리지 않은 디렉토리에 있는 파일을 실행시키려면 어떻게 해야 하는가?
'/usr/local/bin /xxxxx' 처럼 절대 디렉토리를 적어주어 실행하거나 현재 디렉토리에 파일이 있다면 ./를 붙여서 ./xxxx 라고 실행.
3. 만일 패스를 추가해주고 싶다면 자신의 홈디렉토리의 .bash_profile을 에디트하면 된다.
vi ~/.bash_profile
'PATH=$PATH:$HOME/bin' 부분에서 콜론(:)으로 구분하여 덧붙이면 된다. '/usr/local/bin'을 추가해주고 싶으면 PATH=$PATH:$HOME/bin:/usr/local/bin 이렇게 해주고 저장을 하고 나온 후 'source ~/.bash_profile' 이라고 치면 고친 설정이 바로 적용된다.
정보기술에서, 리포지터리는 데이터 집합체가 보관되고 조직적인 방식으로 유지되는 대체로 컴퓨터 저장장치 내의 주요 장소이다. 이 용어는 물건을 넣어둘 수 있는 용기나 방이라는 뜻의 라틴어인 repositorium에서 유래되었으며, 물건들이 모여지는 장소를 의미한다. 이 용어는 어떻게 사용되느냐에 따라, 리포지터리는 사용자가 직접 액세스할 수 있거나, 또는 네트웍 내에서의 재배치나 배포를 위해 특정 데이터베이스, 파일, 또는 문서들이 획득되는 장소일 수 있다. 리포지터리는 저장장치의 일부 접근 가능한 장소 안에 들어가는 데이터 집합체 그 자체이거나, 또는 데이터를 선택적으로 추출하는 어떤 능력을 의미할 수도 있다. 관련되는 용어로는 데이터 웨어하우스와 데이터 마이닝이 있다.
Passphrase : 패스프레이즈
A
passphrase 에 이용된 낱말 다른 원본의 순서는 이다 통제 접근 컴퓨터 시스템, 프로그램 또는 자료에.
passphrase는 a와 유사하다 암호 사용법에서는, 그러나 일반적으로 추가한 안전을 위해 더 길다. Passphrases는
자주 사용한다 두 접근에, 그리고 가동을의 통제하기 위하여, 암호 서기법 프로그램과 체계. Passphrases는으로
passphrase를 사용하는 체계에 특히 적용 가능하다 암호화 키. 기간의 근원은 유례에 의하여를 가진 이다 "암호".
passphrases의 현대 개념은 Sigmund N.에 의해 발명되는 믿어진다.
su- 사용자명 : root 사용자가 일반 사용자로 저환 일반 사용자가 슈퍼 사용자로 전환
su - passwd:
* su super user 의 암호 설정
gattaca@ubuntu-server:~$ sudo passwd root
[sudo] password for gattaca:
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
* Home folder로 이동
cd ~사용자 이름 : home의 자기 폴더로 바로 이동
* 우분투 터미널에서 한글 쓰기
apt-get install scim-hangul 나비를 설치하거나 scim-hangul 을 설치 하는 방법으로 터미널 한글 설정
1.시작
vi file vi를 시작하여 지정한 파일 편집
vi -R file 읽기 전용(read- only) 편집기로서 vi를 시작하여 지정한 파일 편집
view file 읽기 전용(read- only) 편집기로서 vi를 시작하여 지정한 파일 편집
2.종료
:wq 데이터를 저장하고 종료
:q! 데이터를 저장하지 않고 종료
3. 시스템이 다운된 후에 되살리기
vi -r 되살릴 수 있는 모든 파일 이름 보여주기
vi -r file vi를 시작하여 지정한 파일 되살리기
4. 디스플레이 제어하기
^L 현재 화면을 다시 디스플레이하기
:set number 내부 줄 번호 디스플레이
:set nonumber 배부 줄 번호 디스플레이 않기
5. 마지막으로 지운 것 복사하기
p 마지막으로 지워진 것을 커서의 뒤/아래에 삽입
P 마지막으로 지워진 것을 커서의 앞/위에 삽입
xp 두 문자를 바꿈
deep 두 단어를 바꿈
ddp 두 줄을 바꿈
6. 패턴 검색
/rexp 지정된 정규 표현식에 대해 앞으로 이동
/ 이전의 패턴에 대해 앞으로 검색을 반복
?rexp 지정된 정규 표현식에 대해 뒤로 이동
? 이전의 패턴에 대해 뒤로 검색을 반복
n /나 ?명령에 대해 같은 방향으로 반복
N /나 ?명령에 대해 반대 방향으로 반복
7. 약어의 사용
:ab short long short를 long에 대한 약어로 변경
:ab 현재 약어 목록을 표시
:una short 약어 short를 표시
8. 줄 길이의 조정
r 문자를 뉴라인으로 변경
J 줄의 결합
:set wm=n 오른쪽으로 n문자 위치에서 자동적으로 줄 나눔
9. 커서 이동
h 커서를 한 칸 왼쪽으로 이동
j 커서를 한 줄 아래로 이동
k 커서를 한 줄 위로 이동
l 커서를 한 칸 오른쪽으로 이동
커서를 한 칸 왼쪽으로 이동
커서를 한 칸 오른쪽으로 이동
- 커서를 이전 줄의 처음으로 이동
+ 커서를 다음 줄의 처음으로 이동
커서를 다음 줄의 처음으로 이동
0 커서를 현재 줄의 맨 앞으로 이동
$ 커서를 현재 줄의 맨 끝으로 이동
^ 커서를 현재 줄의 첫글자(공백이나 탭이 아닌)로 이동
w 커서를 다음 단어의 첫 글자로 이동
e 커서를 다음 단어의 끝 글자로 이동
b 커서를 이전 단어의 첫 글자로 이동
W w와 같음(문장 부호 무시)
E e와 같음(문장 부호 무시)
B b와 같음(문장 부호 무시)
( 다음 문장의 처음으로 이동
) 이전 문장의 처음으로 이동
{ 다음 문단의 처음으로 이동
} 이전 문단의 처음으로 이동
H 커서를 화면 맨 위로 이동
M 커서를 중간으로 이동
L 커서를 맨 아래로 이동
10. 편집 버퍼를 통한 이동
^F 한 화면 아래로 이동
^B 한 화면 위로 이동
n^F n화면 아래로 이동
n^B n화면 위로 이동
^D 반 화면 아래로 이동
^U 반 화면 위로 이동
n^D n줄만큼 아래로 이동
n^U n줄만큼 위로 이동
11. 셸 명령 실행
:!command vi를 중단하고 지정한 셸 명령을 실행
:!! vi를 중단하고 이전의 셸 명령을 실행
:sh vi를 중단하고 셸을 실행
:!csh vi를 중단하고 새로운 C-셸을 실행
12. 패턴에 의한 치환
:s/pattern/replace/ 현재 줄의 치환
:lines/pattern/replace/ 지정한 줄의 치환
:line,lines/pattern/replace/ 지정한 범위의 치환
:%s/pattern/replace/ 모든 줄의 치환
1,$s/aaaaa/bbbbb/g 모든줄의 치환
13. 데이터 읽기
:liner file file의 내용을 지정한 줄 다음에 삽입
:r file file의 내용을 현재의 줄 다음에 삽입
:liner !command command의 결과를 지정한 줄 다음에 삽입
:r !command command의 결과를 현재의 줄 다음에 삽입
:r !look pattern 지정한 pattern으로 시작된 단어 삽입
14. 정규 표현식을 사용하기 위한 특수 기호
. 뉴라인을 제외한 모든 단일 문자와 대응
* 영 또는 그 이상의 선행 문자와 대응
^ 줄의 시작과 대응
$ 줄의 끝과 대응
\< 단어의 시작과 대응
\> 단어의 끝과 대응
[ ] 묶여진 문자중의 하나와 대응
[^ ] 묶여진 문자를 제외한 아무것하고나 대응
\ 이어지는 기호를 문자 그대로 해석
15. 줄 번호
nG 줄번호 n으로 건너뛰기
1G 편집 버퍼의 첫 줄로 건너뛰기
G 편집 버퍼의 마지막 줄로 건너뛰기
:map g lG g가 lG와 같도록 매크로 정의
16. 삽입
set noautoindent set nocindent
i 입력 모드로 전환, 커서 위치 앞에서 삽입
a 입력 모드로 전환, 커서 위치 뒤에서 삽입
I 입력 모드로 전환, 현재 줄의 앞에 삽입
A 입력 모드로 전환, 현재 줄의 끝에 삽입
o 입력 모드로 전환, 현재 줄의 아래에 전개
O 입력 모드로 전환, 현재 줄의 위에 전개
17. 편집하고 있는 파일을 바꾸기
:e file 지정한 파일의 편집
:e! file 지정한 파일의 편집, 자동 점검의 생략
18. 내용 고치기
r 단지 한 글자만 변경(입력 모드로 바뀌지 않음)
R 입력하는 대로 겹쳐 써서 변경
s 삽입에 의해 한 단어의 변경
C 커서의 위치로부터 줄 끝까지 삽입에 의한 변경
cc 전체 줄을 삽입에 의한 변경
S 전체 줄을 삽입에 의한 변경
cmove 커서부터 move까지 삽입에 의해 변경
~ 대,소문자 바꾸기
19. 고치기의 취소 또는 반복
u 편집 버퍼를 수정했던 마지막 명령을 취소
U 현재 줄을 저장
. 편집 버퍼를 수정했던 마지막 명령 반복
20. 문자 삭제
x 커서가 있는 문자 삭제
X 커서의 왼쪽 문자 삭제
D 커서부터 줄의 끝까지 삭제
dd 현재 줄의 전체 삭제
dmove 커서부터 move까지 삭제
dG 커서부터 편집 버퍼의 끝까지 삭제
d1G 커서부터 편집 버퍼의 맨 앞까지 삭제
:lined 지정한 줄의 삭제
:line, lined 지정한 범위의 삭제
21. 여러 줄의 복사와 이동
:linecotarget 지정한 줄을 복사하여 target 줄 밑에 삽입
:line, linecotarget 지정한 범위를 복사하여 target 줄 밑에 삽입
:linemtarget 지정한 줄로 이동하여 target 줄 밑에 삽입
:line, linemtarget 지정한 범위로 이동하여target 줄 밑에 삽입
22. 데이터를 처리하기 위한 셸 명령의 사용
n!!command n번 줄에서 command의 실행
!move command 커서부터 move까지 command 실행
!move fmt 커서부터 move까지 줄들을 형식 맞추기
23. 데이터 저장하기
:w 원래의 파일로 데이터를 저장
:w file 지정한 파일로 데이터를 저장
:w>> file 지정한 파일에 데이터를 추가
계속 밍기적 밍기적 미루고 있던 그래픽스 숙제를 드디어 해내다! 하루만에 한거라 좀 허접한 면이 있지만. 그래도 할건 다 했다. 세완이형의 도움이 절대적으로 컸고, 이해해야 하는 부분이 좀 더 많다.
아무튼간.
소스와 결과물은 다음과 같다. OpenGl의 각종 함수에 대한 정리도 같이 해 놓는다!
Result
'고' 자를 그리는 숙제였는데, 어떤 선을 긋는게 아니라. 점을 쭉 찍어서 그리는게 포인트이다!
Opengl을 사용해서, 그리는 숙제다!
사용되는 알고리즘으로는 Midpoint 알고리즘 (원 그릴 때,) 직선 알고리즘으로는 Breham 알고리즘 (맞나?;) 암튼 고거다!
키보드 입력을 받으면, 저기 고자 에서 아래 'ㅗ' 받침중 튀어 나온 부분만, 크림슨 색으로 칠해지는게 포인트다.
Soruce Code
/*These part is included file*/ #include <windows.h> #include <gl/glut.h> #include <stdlib.h> #include <stdio.h> #include <math.h>
void myReshape (int w, int h) { glLoadIdentity (); // This function can reset screen glMatrixMode(GL_PROJECTION); // This fuction can make 3D to 2D glViewport (0, 0, w, h); // 중요한 부분인데, 우리가 그리는 부분 즉, 윈도우즈의 크기가 // w 와 h 에 자동으로 반영된다. 이 경우, w,h와 아래줄에서 //사용한 좌표축과의 대응 비율에 따라, 확대가 되기도 하고 축소가 //되어 보이기도 하니 조심! 많이 헷갈리게 된다! 모두 같으면 1:1 gluOrtho2D (0.0, 300.0, 0.0, 300.0); // I used x-width is 300 and y-width is 300 }
// This class is point. class scrPt { public: GLint x, y; };
// This function can save currently color by using point x,y. void setPixel (GLint x, GLint y) { glBegin (GL_POINTS); glVertex2i (x, y); glEnd ( ); }
//원을 그리는 알고리즘이다
// This function can draw circle by using midpoint algorithm void circleMidpoint (scrPt circCtr, GLint radius,int location) { scrPt circPt;
GLint p = 1 - radius; // Initial value of midpoint parameter.
circPt.x = 0; // Set coordinates for top point of circle. circPt.y = radius;
void circlePlotPoints (scrPt, scrPt, int);
/* Plot the initial point in each circle quadrant. */ circlePlotPoints (circCtr, circPt, location);
/* Calculate next points and plot in each octant. */ while (circPt.x < circPt.y) { circPt.x++; if (p < 0) p += 2 * circPt.x + 1; else { circPt.y--; p += 2 * (circPt.x - circPt.y) + 1; } circlePlotPoints (circCtr, circPt, location); } }
/* Bresenham line-drawing procedure for |m| < 1.0. */ void lineBres (int x0, int y0, int xEnd, int yEnd) { int dx = abs(xEnd - x0), dy = abs(yEnd - y0); //abs는 정수 절대값 구하는 함수 // fabs는 실수 int p = 2 * dy - dx; int twoDy = 2 * dy, twoDyMinusDx = 2 * (dy - dx); int x, y;
/* Determine which endpoint to use as start position. */ if (x0 > xEnd) { x = xEnd; y = yEnd; xEnd = x0; } else { x = x0; y = y0; } setPixel (x, y);
while (x < xEnd) { x++; if (p < 0) p += twoDy; else { if(y0<yEnd) { y++; } else { y--; // I must use this code. Because this part can draw case of m<0. } p += twoDyMinusDx; } setPixel (x, y); }
// I must draw line when x0 eqaul xEnd. So,I add this part code. if(x0=xEnd) { while (y < yEnd) { y++; setPixel (x, y); } } }
//This function operate when there is input of keyboard. void refresh(unsigned char key, int x, int y) {
int flag = 0; // This flag can check white line point int i = 0; int pixels2[1000]; // This point can save color frame 배열 선언 부분 glReadPixels(50, 50, 31, 30, GL_RGBA, GL_UNSIGNED_BYTE, &pixels2[0]); /* This fuction can get frame's information and give pixels array information. 이 함수가 프레임에서 받아다 읽어서 pixels2 배열에 넣어 준다. 나는 RGBA 형으로, 50,50 좌표부터 31, 30 크기의 네모난 프레임을 읽어서 부호 없는 byte 타입으로 배열에 저장한 것이다. 위의 코드는 다음과 같이 수정해서 쓸수도 있다.*/
//This part can seperate inter point and outer point //I use method to check point number of wihte. //If there is more two wihte point, There are not more crimson change for(;i<1000;i++) { if(pixels2[i]==0) { glColor3f(220.0/255,20.0/255,60.0/255.0); // Thhs is crimson red color 색 셋팅하는 함수 // 3개의 float 수로 표현 dc143c 16진수 크림슨색 if(flag<=2) { setPixel(50+i%31,50+i/31); // Pixel을 채운다 프레임에 정보로! } } else { if(i%31==0) { flag = 0; } flag += 1; } } glFlush(); // 이것은 현재 프레임에 있는 정보를 그리라는 것으로 프레임 정보는 유지 // 혹시 스왑 버퍼라는 함수는, 함수를 그리고 비우라는 것임 }
//This part is main function of program void main (int argc, char **argv) { // 보통 플랫폼에서 독립된 루틴을 주는 것을 glut라고 하는데 glut 함수는 앞에 전부 glut 함수가 // 들어 있다. glutInit (&argc, argv); // 초기화 시키는 함수 glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); // 현재 사용할 버퍼를 한개를 사용할 //것인지, 2개를 사용할 것인지를 선택 //하고 타입을 RGB로 할 것인지 선 //택 : 상수 인자로 선언되어 있다. //그려질 윈도우즈 콘솔창 조정 부분 glutInitWindowPosition(200,200); glutInitWindowSize(300,300);
glutCreateWindow ("First homework 2003210044 Kim hyeong cheol"); // 창을 생성 glutReshapeFunc (myReshape);//현재 창을 새로 셋팅하고 좌표계 셋팅 glutDisplayFunc (display);//디스플레이를 할 함수를 호출해서 창에 넘겨줌 glutKeyboardFunc(refresh);//키보드 입력이 들어 왔을 때 반응하는 함수 등록 glutMainLoop();//창을 보이게 하고 무한 루프 돌게 함 //이건 C의 팁인데, 그냥 함수의 이름을 주면 주소 값으로 들어가고, 자동으로 인자값이 default 되어 있으면 들어간다. 예를 들면, myReshape 도 함수지만, default값이 들어가고 호출된다. }