증상 : ORA-12638 Credential retrieval failed (신용검색에 실패했습니다) 경고창 출력

원인 : Oracle 설치시 Admin 권한으로 설치하지 않아 발생하는 문제


해결 방법

1. Oracle 설치 경로 찾기

- Oracle Home으로 지정한 경로를 찾아 network\admin 폴더로 이동한다. 

(디폴트로 설치 했을 경우 : C:\app\사용자명\product\11.2.0\client_1\network\admin)




2. sqlnet.ora 파일 수정

- sqlnet.ora 파일을 메모장으로 열어서


SQLNET.AUTHENTICATION_SERVICES= (NTS) <- 이부분을 주석처리한다.



# SQLNET.AUTHENTICATION_SERVICES= (NTS)





이러면 끝!

저장시에 권한문제가 생기면 바탕화면에 임시로 저장 후 해당 파일을 덮어씌우기해서 바꿔치기하면 된다.

Posted by 루우지





















젠킨스란?

- 젠킨스는 Java로제작된 오픈소스 CI(지속적 통합)도구 이다. Jenkins에는 Tomcat 서버가 내장되어 Servlet Container위에 돌아가는 웹서버 이다. 

- SVN, GIT, CVS ... 등과 같은 많은 SCM을 지원한다.

- 쉽게 빌드 결과물을 만들고 테스트하며 배포할수 있는 아주 유용한 도구이다.







젠킨스 다운로드 받기


https://jenkins.io/download/



- 위의 url에 들어가면 다양한 os에서의 젠킨스 설치파일을 제공해준다. 본 게시물에서는 windows os에서의 설치를 다룰 예정이니 windows 설치파일을 다운받는다.




젠킨스 설치하기

- 다운로드 받은 파일을 압출풀고 인스톨러를 실행한다.

- 설치과정은 매우 쉽다. 그냥 NEXT만 눌러주면된다~




- 끝 -



정상 설치가 되었으면 Jenkins 웹서버가 자동으로 구동된다.


http://localhost:8080/


위의 주소로 접속하면 젠킨스의 초기 셋팅을 해줘야한다.









젠킨스는 초기 셋업시 패스워드가 필요하다.

설치된 폴더 C:\Program Files (x86)\Jenkins\secrets 에서


initialAdminPassword파일을 오픈하면 비밀번호가 나오는데 그걸 복사해서 진행해준다.







Jenkins에서 필요한 플러그인을 설치할수 있다.


왼쪽은 추천되는 플러그인 

오른쪽은 사용자가 직접 셀렉할수있는 플러그인 페이지이다.

나는 귀찮으니 왼쪽~




이제 기본적인 셋팅은 끝났다.


http://localhost:8080/


로컬 주소로 재접속을 해보면 



젠킨스가 셋업된 화면을 볼 수있다.





포트번호를 바꿔주고 싶다면?

C:\Program Files (x86)\Jenkins 폴더의 jenkins.xml을 수정해준다.



밑줄친 포트번호를 수정후 저장한뒤 젠키스를 재시작하면 끝~















1


Posted by 루우지


리눅스 os에 익숙하지 않아서 블로그에 정리할겸 올려봅니다.

리눅스에서는 압축파일의 확장자로 tar나 tar.gz파일을 볼 수 있는데요





1. tar 압축

> tar -cvf [파일명.tar]





2. tar 압축 풀기

> tar -xvf [파일명.tar]





3. tar.gz 압축

> gar -zcvf [파일명.tar.gz]





4. tar.gz 압출 풀기

> tar zxvf [파일명.tar.gz]


'Linux OS' 카테고리의 다른 글

[Linux] tar, tar.gz 파일 명령어 (압축하기/압축풀기)  (0) 2018.09.02
Posted by 루우지

1. 메모리 구조


메모리는 크게 4개의 영역으로 나뉜다. 코드 영역, 스택 영역, 힙영역, 데이터 영역 이다.


1) 코드 영역 : 실행 명령어 저장

- 소스코드가 저장되는 영역으로, 실행할 명령어들이 순서대로 쌓인다.

- cpu가 이 영역에서 명령어들을 하나씩 가져다가 처리한다. (큐 구조)



2) 스택 영역 : 개발자가 제일 많이 사용하는 메모리는 스택 메모리 영역이다.  

- 스택이란 모든 원소들의 삽입 삭제를 한쪽 방향에서만 수행하도록 하는 선형 자료 구조이다.

- 이를 후입선출방식 (Last In First Out)이라 한다.

- 스택메모리는 지역변수와 매개변수같은 값들이 저장되는 공간이다.



void Test(int a)
{
    char b = 'A';
    int c = 1;
    double d = 3.14;
}

먼저 메모리에 int a 4바이트가 할당되고, char b 1byte, int c 4byte, double d 8 byte가 순서대로 할당되며 함수가 종료될때에는 거꾸로 메모리에서 제거된다. (d, c, b, a)



3) 힙 영역 : 개발자가 직접 할당

- 힙은 컴퓨터 메모리의 일부가 할당되었다가 회수되는 일들의 반복을 의미

- 합은 컴파일시가 아닌 실행 시 사용자로부터 할당 메모리를 입력 받음

- 생성과 삭제를 개발자가 직접 해줘야하는데, 삭제를 해주지 않으면 메모리 누수현상(메모리 릭)이 생긴다. 



4) 데이터 영역 : 전역 변수, 스태틱수 저장

- 전역 변수와 static변수가 저장되는 메모리이다.

- 프로그램 시작시 모든 전역변수와 static 변수가 데이터 영역에 저장되며, 프로그램이 종료시 메모리에서 소멸된다.






2. 동적 메모리 할당

1) 동적으로 메모리를 할당 하는 이유


일반적으로 변수는 컴파일타임에 할당된다. 

그렇다면 다음의 상황에서는 어떻게 될까?


Q. 전교생이 10명인 학교의 학생 수를 배열로 선언한다면?

A. int student[10];


Q. 학생수가 100명으로 늘어나게 되면?

A. int stduent[100];


학생수가 계속 유동적으로 변하게 된다면?

개발자가 그 상황에 맞게 계속 변수를 할당해줄 수 없다. 학생 수를 고정하지 말고 실행시 결정하자는 개념


int num;
fputs("학생수를 입력하세요 : ",stdout);
scanf("%d", &num);
int student[num];
문제점 
 - scanf는 런타임에 실행되지만 사용자가 값을 입력하는건 런타임이다. 
 - int student[num]은 컴파일타임에 실행된다. 런타임에 입력 받은 변수를 컴파일 타임에 대입하는 형태가 되기 때문에 컴파일 에러가 생긴다. 

 해결 방법

 - 실행 중에 학생 수를 알아야 하는 경우, 동적 메모리 할당 기법을 통해 문제 해결이 가능하다.





2) 메모리 할당 및 해제


malloc()

- 동적 메모리 할당 함수의 원형


void* malloc(size_t size);


- malloc 또는 말록이라고도 읽는다.

- 전달인자size는 바이트 단위로 입력한다.

- 메모리 할당이 되면 메모리의 주소값을 리턴한다.

- 메모리 부족 시 null 포인터 리턴한다.

- 리턴형이 void*인데, 타입이 지정되어 있지 않는 포인터를 리턴 한다.



free()

- 동적 메모리 해제 함수의 원형


void free(void* memblock);


- 메모리 사용후 반드시 해제 해야한다. (메모리 누수현상(메모리 릭)이 발생한다.)

- 전달인자로 메모리를 가리키는 포인터를 대입한다.



#include 
#include 

int main(void)
{
    int num;
    int* student);

    fputs("학생 수 입력 : ",stdout);
    scanf("%d", &num);
    student = (int*)malloc(sizeof((int)*num);

    if(student == null)
    {
        printf("메모리가 부족하가 부족하여 메모리를 할당 할 수 없습니다.\n");
        return 0;
    }

    printf("학당된 메모리의 크기는 %d 입니다. \n", sizeof((int)*num);
    free(student);

    return 0;
}



realloc()

- 실시간 메모리를 할당하여 사용한다 해도 사용중에 메모리 크기를 더 늘려야 하는 경우가 발생할 수 있다.

- malloc 함수로 할당된 메모리를 다시 동적으로 재할당해주는 함수가 realloc이다.




#include 
#include 

int main(void)
{
	int i;
	int *arr = (int*)malloc(sizeof(int) * 5);
	int *rearr; 

	for (i = 0; i < 5; i++)
	{
		arr[i] = i + 1;
	}
	rearr = (int*)realloc(arr, sizeof(int) * 10);
	for (i = 0; i < 10; i++)
	{
		rearr[i] = i + 1;
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d\n", rearr[i]);
	}

	free(rearr);
	return 0;
}


calloc()

- malooc 함수와 똑같은 기능을 갖는다

- 전달인자의 형태와 조금 다른데, 메모리 개수와 자료형의 크기를 대입한다.


int* a = (int*)calloc(elt_count, elt_size);

int* a = (int*)malloc(size * sizeof(int));


#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int num, i, total = 0;
	int* student;

	fputs("학생 수 입력 : ", stdout);
	scanf("%d", &num);
	student = (int*)calloc(num, sizeof(int));

	if (student == NULL)
	{
		printf("메모리가 부족하가 부족하여 메모리를 할당할 수 없습니다.\n");
		return 0;
	}

	for (i = 0; i < num; i++)
	{
		printf("%d번째 학생의 성적 입력 : ", i + 1);
		scanf("%d", &student[i]);
	}
	for (i = 0; i < num; i++)
	{
		total += student[i];
	}
	printf("총점 : %d 평균 : %d \n", total, total / num);
	free(student);
	return 0;
}



memset()

- 메모리 블록에서 모든 바이트를 특정 값으로 설정 할 때 사용하는 초기화 함수


void* memset(void* dest, int c, size_t count)


#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

int main(void)
{
	int* arr= (int*)malloc(sizeof(int) * 10);
	int i;
	
	printf("=========초기화 하기 전========= ");
	for (i = 0; i < 10; i++)
	{
		printf("%d\n", arr[i]);
	}
	memset(arr, 0, sizeof(int) * 10);
	printf("=========초기화 하기 후-======== ");
	for (i = 0; i < 10; i++)
	{
		printf("%d\n", arr[i]);
	}
	free(arr);
	return 0;
}


>



memcpy()

- 메모리를 복사하는 함수


void* memcpy(void* dest, void* src, size_t count);


#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

int main(void)
{
	int* arr1 = (int*)malloc(sizeof(int) * 5);
	int arr2[5];
	int i;
	
	for (i = 0; i < 5; i++)
	{
		arr1[i] = i + 1;
	}
	memcpy(arr2, arr1, sizeof(int) * 5);
	for (i = 0; i < 5; i++)
	{
		printf("%d\n", arr2[i]);
	}
	free(arr1);
	return 0;
}


memcmp()

- 메모리를 비교하는 함수


void* memcmp(const void* ptr1, const void* ptr2, size_t num);


#include <stdio.h>
#include <string.h>

int main(void)
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 1,2,3,4,5 };
	
	if (memcmp(arr1, arr2, sizeof(int) * 5) == 0)
	{
		printf("arr 1 == arr2");
	}
	else
	{
		printf("arr 1 != arr2");
	}
	return 0;
}


Posted by 루우지