반응형

IndexOutOfBoundsException이란?

indexOutOfBoundsException은 리스트형 객체에서 선언되지 않은 요소를 get 하는 경우에 발생하게 된다.

 

틀린 에러 해결법 - null 판별

그렇다면 get 하기 전에 객체가 NULL 인지 판별해준다면 에러가 발생 안 하지 않을까? 정답은 NO다.

아쉽게도 아래의 코드에서도 동일하게 indexOutOfBoundsException 에러가 발생하게 된다.

아니 왜?! 객체가 null이 아니라면 첫 번째 요소가 존재하여 에러가 발생하지 않아야 하는 게 아닌가요??

if (tests != null)
	tests.get(0);

 

이미 null에 대한 validation을 했는데도 indexOutOfBoundsException이 발생하는 이유 바로 객체가 비어있는 한 상태, 즉 EMPTY 상태이기 때문이다. 

 

test = []  

(예를 들어, List<String> tests = new ArrayList<>() 을 정의할 경우 만들어지는 tests 객체의 상태)

 

이와 같은 상태로 tests 객체는 정의되어 있는 것이다.그렇기 때문에 empty 객체에서 element 를 가져오려고 하는 것이기 때문에 RunTimeException이 발생하게 된다.

 

진짜 에러 해결법 1 - size 판별

if (tests != null && tests.size() != 0)
	test.get(0);

진짜 에러 해결법 2 - ObjectUtils  사용

ObjectUtils의 isEmpty 함수는 null와 empty 둘다 validation 해주기 때문에 깔끔하게 에러 발생을 막을 수 있다. apache.commons.lang3.ObjectUtils 또는 springframework.util.ObjectUtils 라이브러리를 import 하여 해당 함수를 사용하면 된다.

if (ObjectUtils.isNotEmpty(tests))
	test.get(0);

또는

if (!ObjectUtils.isEmpty(tests))
	test.get(0);

 

반응형
반응형

곧 10주년이 되어가는 나의 맥북에어

10년을 사용하며 공식 서비스센터에서 모니터 교체 1회, 배터리 교체 1회 빼고는 큰 고장 없이 잘 사용하고 있었지만

 

아아... 그는 또 갔습니다.

 

 

 

 

 

충전선이 실수로 뽑히는 순간 이제 바로 꺼져버리는 순간이 와버렸습니다. 하지만 공식 서비스 센터에 문의를 하니 이제 맥북 에어 2012는 구형 모델이라 더 이상 정식 서비스센터에서 수리 지원을 받을 수 없다는 답변을 받고, 데스크톱처럼 충전선을 계속 꽂은 상태로만 사용을 하였습니다.

그러다 문득 든 생각! 내가 교체할 수 있지 않을까?

 

해서 서치를 해보니 완전 가능!!!

 

 

 

 

#내돈내산

#맥북배터리셀프수리

#맥북에어2012mid

 

사실 배터리만 말썽이지 그것 이외에는 말짱하게 넷플릭스 용으로 사용하고 있던 맥북이 정말로 영영 떠나버릴까 걱정이 되긴 했지만, 너무 쉽게! 아주 간편하게! 첫 박스 사진 찍고 커피도 만들고 이것저것 잡일도 하고 청소도 같이 하면서 30분 컷으로 교체를 완료할 수 있었습니다. 

 
아주 쉬워요!!!
Very Simple and Easy!!

 

 

 

 

 

 

쨘!! 뽁뽁이에 잘 쌓여서 배터리가 도착하였습니다.

 

 

 

 

 

배터리, 그리고 맥북 뒷 커버 나사 제거를 위한 드라이버 2 종류가 들어있습니다.

맥북을 준비하고 총 10개의 스크류를 제거해주었습니다.

 

 

 

 

 

요로코롬 위치에 알맞도록 놓아두고요. 물론 딴짓하다가 책상 쳐서 흐트러진 건 안 비밀!

그리고 드러난 맥북과 먼지들.

신기했던 건 이전에 한번 교체했던 배터리와 이번에 구매한 배터리 제조사가 같더라고요. 그때 공식 서비스센터에서 20 정도 주고 교체했던 것 같은데, 5만 원에 손쉽게 동일한 배터리로 교체를 할 수 있었습니다.

 

 

 

 

 

 

배터리 제거를 위해 요 커넥터를 분리시켜줘야 하는데요. 살짝 제거하기 위한 공간이 다소 부족하다는 느낌이 듭니다. 손잡이 부분을 위쪽으로 잡고 올리면 커넥터 부분이 망가질 수도 있기 때문에, 커넥터 윗부분을 한 손으로 그리고 나머지 한 손으로 손잡이 부분을 잡고 그대로 쭉- 좀 아래 방향으로 밀어 빼시면 안전하게 빼내실 수 있습니다.

 

 


그러면 깨끗하게 배터리를 들어내실 수 있습니다!!

아쉽게도 배터리 가느라 신났는지 새로운 배터리로 교체하고서는 사진을 찍지 않았네요ㅋㅋㅋㅋ

동일한 방향으로 새로운 배터리를 장착해주시고요. 저는 다시 커넥터를 꽂을 때도 조금 빡빡했는데요. 선을 조금 아래로 접은 상태에서 밀어 넣어주니 깔끔하게 잘 들어갔습니다!!

다시 뒤판을 덮고 나사를 조여주세요!!


 

 

두근 두근

 

 

물론 다들 아시겠지만
배터리 정보는 🍏 > 이 Mac에 관하여 > 시스템 리포트 > 하드웨어 > 전원에서 확인하실 수 있습니다.

 

 

 

배터리 교체 전 최대 충전 용량 0에서 7203으로 늘어났습니다!!!

w+0+w

 

 

 

 

 

우리 함께 더 오래오래 맥북을 사용해서 환경을 보호해요!!

 

반응형
반응형

 

 

Google Search Console이란?

블로그 유입 통계를 이따금씩 확인하면 내 블로그에 방문하는 사람들은 모두 daum 검색을 통해 유입되었다. 왜 구글이나 네이버 등에서는 검색이 되지 않는 건가 의아해했는데, 그 해답은 Google Search Console에 있었다. 

 

Google Search Console을 사용하면

 

첫째, 블로그에 대한 자세한 통계와 진단을 볼 수 있고

둘째, 사이트맵을 등록함으로써 구글에서 검색이 잘 되도록 할 수도 있다.

 

(*사이트맵 :  사이트에 있는 페이지, 동영상 및 기타 파일과 그 관계에 관한 정보를 제공하는 파일)

 

 

 

티스토리 블로그 Google Search Console에 등록하기

1. 구글 서치 콘솔에 로그인 : https://search.google.com/search-console

 

 

2. URL 접두어(URL prefix) 항목에 블로그 URL 입력

 

 

 

3. 블로그 오너십 확인을 위해 블로그 설정에서 HTML 태그 추가

 

 

 

- 티스토리 관리 > 꾸미기 > 스킨 편집 > html 편집 찾아가기

- <head> 아래에 HTML meta tag 복붙

 

 

 

4. VERIFY

 

 

 

 

5. 블로그 인증됨 확인

 

 

 

 

싸이트맵 등록하기

 

2020 티스토리에서 사이트맵이 자동 생성된다. 블로그 주소 뒤에 + /sitemap.xml을 붙이면 손쉽게 사이트맵 파일 접근이 가능하다. 이를 Google Search Console에 등록해주자

 

 

 

 

 

짠!

이제 구글에서 검색이 가능해졌습니다. 과연 이젠 구글에서도 유입되어 들어올까요?

 

 

 구글에서 검색이 가능해졌습니다!

 

[ 참고 ]

https://developers.google.com/search/docs/advanced/guidelines/bloggers?hl=ko#your-blog-and-search-console

반응형

'취미' 카테고리의 다른 글

[뮤지컬] Avenue Q / 줄거리, 감상 후기  (0) 2020.09.25
반응형

#라이브러리 없이 코딩하기

 

 

구현 알고리즘

  • Merge Sort

  • Quick Sort

 

다음번에 시도해 보기

  • 퀵소트로 구현하면 시간을 더 단축시킬 수 있는 문제인 것 같으니 도전해보기 (머지소트 실행시간 : 80ms)

+ 퀵소트는 시간을 단축시키지는 않았지만, 머지소트에 사용되는 포인터 어레이 만큼의 메모리 사용량을 줄일 수 있었다.

(아래 : merge sort, 위 : quick sort)

 

소스 코드 (merge sort)

#include <stdio.h>

#define MAX_NODE 100001

struct Node {
	char name[11];
	int korean, english, math;
} nodes[MAX_NODE], *nt[MAX_NODE], *tmp[MAX_NODE];

void mstrcpy(char* dst, const char* src) {
	while(*src) {
		*dst++ = *src++;
	}
	*dst = '\0';
}
int mstrcmp(const char* a, const char* b) {
	while (*a && *a == *b) {
		++a; ++b;
	}
	return *b - *a;
}

int cmpScore(Node *n1, Node *n2) {

	if (n1->korean != n2->korean)
		return n1->korean - n2->korean;
	if (n1->english != n2->english)
		return n2->english - n1->english;
	if (n1->math != n2->math)
		return n1->math - n2->math;
	return mstrcmp(n1->name, n2->name);
}

void mergeSort(int start, int end) {

	if (start < end) {
		int mid = (start + end) / 2;
		mergeSort(start, mid);
		mergeSort(mid + 1, end);

		int s1 = start;
		int s2 = mid + 1;
		int idx = start;
		while (s1 <= mid && s2 <= end) {
			if (cmpScore(nt[s1], nt[s2]) > 0)
				tmp[idx++] = nt[s1++];
			else
				tmp[idx++] = nt[s2++];
		}
		while (s1 <= mid) tmp[idx++] = nt[s1++];
		while (s2 <= end) tmp[idx++] = nt[s2++];

		for (int i = start; i <= end; i++)
			nt[i] = tmp[i];
	}
}

int main() {
	int n;
	scanf("%d", &n);

	char name[11];
	int a, b, c;
	for (int i = 0; i < n; i++) {
		scanf("%s %d %d %d", name, &a, &b, &c);

		Node* newN = &nodes[i];
		mstrcpy(newN->name, name);
		newN->korean = a;
		newN->english = b;
		newN->math = c;

		nt[i] = newN;
	}

	mergeSort(0, n-1);

	for (int i = 0; i < n; i++) {
		printf("%s\n", nt[i]->name);
	}
}

 

소스코드 (quick sort)

#include <stdio.h>

#define MAX_NODE 100001

struct Node {
	char name[11];
	int korean, english, math;
} nodes[MAX_NODE], * nt[MAX_NODE];

void mstrcpy(char* dst, const char* src) {
	while(*src) {
		*dst++ = *src++;
	}
	*dst = '\0';
}
int mstrcmp(const char* a, const char* b) {
	while (*a && *a == *b) {
		++a; ++b;
	}
	return *b - *a;
}

int cmpScore(Node *n1, Node *n2) {

	if (n1->korean != n2->korean)
		return n1->korean - n2->korean;
	if (n1->english != n2->english)
		return n2->english - n1->english;
	if (n1->math != n2->math)
		return n1->math - n2->math;
	return mstrcmp(n1->name, n2->name);
}

void quickSort(int start, int end) {
	if (start >= end) return;

	int pivot = start;
	int i = pivot + 1;
	int j = end;
	Node* tmp;

	while (i <= j) {
		while (i <= end && cmpScore(nt[i], nt[pivot]) > 0)
			i++;
		while (j > start && cmpScore(nt[j], nt[pivot]) < 0)
			j--;
		
		if (i > j) {
			tmp = nt[j];
			nt[j] = nt[pivot];
			nt[pivot] = tmp;
		}
		else {
			tmp = nt[i];
			nt[i] = nt[j];
			nt[j] = tmp;
		}

	}

	quickSort(start, j - 1);
	quickSort(j + 1, end);
}

int main() {
	int n;
	scanf("%d", &n);

	char name[11];
	int a, b, c;
	for (int i = 0; i < n; i++) {
		scanf("%s %d %d %d", name, &a, &b, &c);

		Node* newN = &nodes[i];
		mstrcpy(newN->name, name);
		newN->korean = a;
		newN->english = b;
		newN->math = c;

		nt[i] = newN;
	}

	//mergeSort(0, n-1);
	quickSort(0, n - 1);

	for (int i = 0; i < n; i++) {
		printf("%s\n", nt[i]->name);
	}
}
반응형
반응형

#라이브러리 없이 코딩하기

 

 

구현 알고리즘

  • Hash

  • Merge Sort

 

소스 코드

#include <stdio.h>
#define MAX_TABLE 500017
struct Hash {
    char name[21];
    Hash* next;
} h[MAX_TABLE], * ht[MAX_TABLE], * target[MAX_TABLE];
int h_idx = 0, t_idx = 0;

unsigned long getHash(const char* str)
{
    unsigned long hash = 5381;
    int c;

    while (c = *str++)
    {
        hash = (((hash << 5) + hash) + c);
    }

    return hash;
}

int mstrcmp(const char* a, const char* b) {
    while (*a && *a == *b) {
        ++a; ++b;
    }
    return *a - *b;
}
void mstrcpy(char* dst, const char* src) {
    while (*src)
        *dst++ = *src++;
    *dst = '\0';
}

void mergeSort(int start, int end) {
    if (start < end) {
        int mid = (start + end) / 2;
        mergeSort(start, mid);
        mergeSort(mid + 1, end);

        int s1 = start;
        int s2 = mid + 1;
        int idx = start;
        while (s1 <= mid && s2 <= end) {
            if (mstrcmp(target[s1]->name, target[s2]->name) <= 0) {
                ht[idx++] = target[s1++];
            }
            else {
                ht[idx++] = target[s2++];
            }
        }
        while (s1 <= mid) ht[idx++] = target[s1++];
        while (s2 <= end) ht[idx++] = target[s2++];

        for (int i = start; i <= end; i++)
            target[i] = ht[i];
    }
}

int main() {
    int n, m;

    scanf("%d %d", &n, &m);

    char name[21];
    for (int i = 0; i < n; i++) {
        scanf("%s", name);

        unsigned long key = getHash(name) % MAX_TABLE;

        Hash* newH = &h[h_idx++];
        mstrcpy(newH->name, name);

        newH->next = ht[key];
        ht[key] = newH;
    }

    for (int i = 0; i < m; i++) {
        scanf("%s", name);

        unsigned long key = getHash(name) % MAX_TABLE;
        for (Hash* cur = ht[key]; cur != 0; cur = cur->next) {
            if (mstrcmp(cur->name, name) == 0) {
                target[t_idx++] = cur;
                break;
            }
        }
    }

    mergeSort(0, t_idx - 1);

    printf("%d\n", t_idx);
    for (int i = 0; i < t_idx; i++) {
        printf("%s\n", target[i]->name);
    }
}
반응형

+ Recent posts