기술없는 기술 블로그 RSS 태그 관리 글쓰기 방명록
study (16)
2021-05-27 22:05:48


지난주에 마감한 카카오게임즈에서 기술직군 인턴에 지원했는데 코딩테스트 대신 사전과제가 있었다. 인턴십 지원 기간에 업로드 할 만한 내용은 아니라 시간이 좀 지난 오늘부터 포스팅을 시작하기로 했다.


아무래도 사전과제 1번 항목의 경우 업무 수행에 관한 서술과제이다 보니 조금 조사가 필요했다.
채용 정보 사이트에서 카카오게임즈 채용에 대해 검색해 보니 기술지원 PM에 대한 채용의 지원 조건, 우대 사항과 인터뷰 등을 검색으로 확인할 수 있었고 그림처럼 플랫폼과 서비스 인프라 두 가지로 요약할 수 있었다.

플랫폼 연동 기술지원 PM 채용 정보

https://www.inven.co.kr/webzine/news/?news=206550
플랫폼, 서비스 인프라 구축에 대한 발표 내용

해당 항목에 대해선 구체적인 서술 내용은 올리지 않으려 한다. 기술직군 entity 내부의 resolve Technical Issue와 사업, 개발사, 기술직군, QA 사이의 Issue를 연관 관계로 기술직군을 중심으로 개발사와의 어떤 기술적인 이슈 해결을 위해 소통을 할지에 대해 기술했다.

2021-05-25 20:28:46

HTML, CSS, JavaScript는 웹 브라우저에서 페이지를 렌더링하기 위해 필요한 세 가지 요소이다.

 

이 중에서 특별한 경우가 아니라면 눈에 보이는 디자인 요소인 HTML과 CSS파일을 빨리 불러와 페이지 로딩 속도를 높이는 것이 중요하다. 사람 눈이란게 간사해서 0.1초만 깜빡이면서 로딩이 늦어도 페이지 렉이 심하다고 생각하기 때문

 

아무튼 HTML은 위에서부터 차례대로 코드가 실행되기 때문에 <head>가 끝나야 <body>가 실행된다.

즉 header에서 대용량의 제이쿼리와 자바스크립트문이 존재한다면 해당 스크립트문의 처리가 끝나기 전까지는 화면에서는 body 부분이 실행되지 않기 때문에 백지화면만 노출된다.

 

그에 반해서 css는 화면의 디자인을 표현하는 역할을 맡고있으니 head에서 미리 불러 와야한다. css파일을 헤더에서 미리 불러오지 않으면 존재하지 않는 css파일을 참조한 화면이 흔히 말하는 엑박같이 깨진 상태를 유저가 볼 수 있기 때문이다.

로딩이 안되면 자동차가 안나오고 로딩이 덜되면 자동차가 박살난다

2021-04-17 00:02:08

programmers.co.kr/learn/courses/30/lessons/42626

 

import java.util.PriorityQueue;

class Solution {
    public int solution(int[] scoville, int K) {
        
        // 전처리 ,입력
        PriorityQueue<Integer> pq = new PriorityQueue<>();
        int answer = 0;
        for ( int i : scoville ){
            pq.add(i);
        }
        
        // 계산
        int a, b;
        try{
            while (pq.peek() < K ){
                a = pq.poll();
                b = pq.poll();
                pq.add(a + 2 * b);
                answer++;
            }
        } catch(Exception e){
            return -1;
        }
        return answer;
    }
}

 

프로그래머스에서 기본 연습문제로 제공하는 Heap 문제

 

 

우선순위 큐를 사용해서 첫번째와 두번째 값을 가져오는데 특정 값 K가 만족 되지 않으면 계속 반복하는데 while(true)를 사용하면 불가능한 경우에도 출력하려다가 NullPointException을 발생시키게 된다. 그 에러 케이스를 이용해서 return -1을 사용하여 문제 해결

'study > algorithm' 카테고리의 다른 글

Java에서 쓰는 equals()와 hashCode()  (0) 2021.04.06
2021-04-10 23:55:12

마리아디비 설치는 sudo apt-get install mariadb-server를 터미널에 입력하면 설치할 수 있고 mysql과 사용법이 똑같아서 sudo mysql -uroot -p로 쉽게 접속할 수 있지만 라즈베리에 설치하다 보니 온라인으로 접속할 필요를 느껴서 워크벤치랑 온라인으로 연결하기로 했다.

나는 mariadb-server를 사용하니까 /etc/mysql/mariadb.conf.d 디렉토리 안에 있는 50-server.cnf를 편집한다.

$ sudo vi /etc/mysql/mariadb.conf.d/50-server.cnf

bind-address = 127.0.0.1 부분을 주석처리하거나 지워준다.
일부러 구분하기 편하게 ## 두개로 주석처리했다.

bind-address는 해당 IP 주소에서 접속만 허용한다는 의미다. 루프백 IP 혹은 localhost로 부르는 IP가 127.0.0.1이니까 컴퓨터 내부에서만 접속을 허용한다는 의미다.

$ sudo service mysql restart


service 대신에 systemctl을 써도 상관없다. 설정을 바꿨으니 재실행 시킨다.

[mysql]> grant all on <DB이름>.<테이블> to <'user'>@<'host'> identified by <'password'>; [mysql]> flush privileges;


host 부분에 '%'를 넣으면 모든 IP에서 접근이 가능해지고 'localhost' 혹은 '127.0.0.1'을 넣으면 라즈베리파이에서만 접근이 가능하다. 원격으로 조회가 안된다는 뜻.

모든 DB와 테이블에 권한을 부여하고싶으면 *.* 을 특정 DB만 부여하고싶으면 <특정 DB이름>.* 를 특정 DB의 특정 테이블만 권한을 부여하고싶으면 <DB 이름>.<해당 DB에 있는 테이블 이름>을 적는다.

2021-04-07 23:27:01

라즈베리파이 ftp 연결하다 service랑 systemctl 차이가 궁금해서 찾아봤다

 

간편하게 말하면 service는 systemctl의 wrapper script다

밑에 있는 사이트에서 systemctl을 검색하면 systemctl call이라는 주석이 보인다.

start나 stop과 같은 기능을 할 때 부가적인 요소들을 어느정도 같이 제어해준다고 생각하면 될 것 같다.

 

git.launchpad.net/~usd-import-team/ubuntu/+source/init-system-helpers/tree/script/service?h=ubuntu/xenial

 

service\script - ~usd-import-team/ubuntu/+source/init-system-helpers - [no description]

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 8

git.launchpad.net

 

 

2021-04-06 18:01:20

Java에서 동치성을 확인 할 때 equals()와 hashCode() 두 개의 메서드로 확인하는 데 예전에 공부했던 기억은 있는데 정확하게 기억이 안나서 다시 보기로 했다.

 

Java API에서 hashCode()와 equals() 메서드의 정의는 java.lang.Object에 있다.

 

docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode--

 

Object (Java Platform SE 8 )

Called by the garbage collector on an object when garbage collection determines that there are no more references to the object. A subclass overrides the finalize method to dispose of system resources or to perform other cleanup. The general contract of fi

docs.oracle.com

해시코드

This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the Java™ programming language.

 

해시코드 메서드는 따로 오버라이딩을 하지 않으면 객체의 내부 주소를 정수형으로 반환한다.

 

따로 객체를 만들고 오버라이딩 하지 않은 후 System.identityHashCode()를 사용해서 비교해봤다.

public class A{
	priavte int a;
    
	A(int a){
		this.a = a;
	}
}


public class Main(String[] args){
	A a = new A(1);
	A b = new A(1);

	System.out.println("address of a\t: " + System.identityHashCode(a));
	System.out.println("hashCode of a \t: " + a.hashCode());
		
	System.out.println();
	System.out.println("address of b\t: " + System.identityHashCode(b));
	System.out.println("hashCode of b \t: " + b.hashCode());

	System.out.println();
	System.out.println("a.equals(b) : " + a.equals(b));
}

 

실행 결과

 

당연히 해시코드를 따로 선언해주면 잘 돌아간다.

 

public class A{
	priavte int a;
    
	A(int a){
		this.a = a;
	}
    
    @Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + a;
		return result;
	}
}

hashCode() 오버라이드 결과

 

해시코드하면 떠오르는 게 있는데 HashMap, HashSet, HashTable들이다.

해시코드를 키로 사용하는 애들이니까 hashCode()만 오버라이드하면 같은 객체로 인식하지 않을까 테스트 해봤다.

 

import java.util.HashMap;

public class Main(String[] args){

	HashMap<A, Integer> hm = new HashMap<>();
	A a = new A(1);
	A b = new A(1);
    
	hm.put(a, 1);
	hm.put(b, 1);
    
	System.out.println("address of a\t: " + System.identityHashCode(a));
	System.out.println("hashCode of a \t: " + a.hashCode());
		
	System.out.println();
	System.out.println("address of b\t: " + System.identityHashCode(b));
	System.out.println("hashCode of b \t: " + b.hashCode());

	System.out.println();
	System.out.println("a.equals(b) : " + a.equals(b));

	System.out.println("HashMap Size : " + hm.size());
}

HashMap

 

 

 

해시맵 사이즈를 보면 해시코드값만 같다고 키값이 같은건 아니란걸 알 수 있다.

 

자세히 알아본 결과 해시 구조를 사용한 자료구조에서는 HashCode를 먼저 비교한 후에 해시코드가 동일하면 equals()를 통해서 동치성을 확인한다는 내용이었다.

 

잘찾아보면 친절하게 설명도 해주신다

 

docs.oracle.com/javase/8/docs/api/java/util/HashMap.html#get-java.lang.Object-

 

HashMap (Java Platform SE 8 )

If the specified key is not already associated with a value (or is mapped to null), attempts to compute its value using the given mapping function and enters it into this map unless null. If the function returns null no mapping is recorded. If the function

docs.oracle.com

 

More formally, if this map contains a mapping from a key k to a value v such that (key==null ? k==null : key.equals(k)), then this method returns v; otherwise it returns null. (There can be at most one such mapping.)

 

여기서 K가 의미하는 자료형이 해시코드라는걸 생각한다면 해시구조에서 동치성을 확인 할 때 해시코드를 먼저 비교하고 해시코드가 같으면 equals()로 동치성을 확인한다는걸 알았다.

 

만약에 해시코드만 다르다? 동치성은 확인조차 못하고 넘어간다.

 

# Reference Type의 경우는 위에서 서술한 Object Class에서 상속받은 HashCode()와 equals()를 오버라이딩 하거나 시메모리 기본 메서드를 활용해서 동치성을 확인하지만 Primitive Type은 어떻게 동치성 ( == )을 확인할 수 있는 이유는 다음과 같다.

변수 선언부는 JVM의 Runtime Data Areadptj JVM Stack에 저장되고 기본형 타입의 데이터는 스택에 바로 저장하는 것이 아니라 Method Area 내부에 상수를 저장해둔 공간의 주소를 point 한다.

그래서 각 기본형 타입의 변수는 Method Area에 저장된 상수값을 불러오는 것이도 동치성을 확인하는 작업 ( == ) 에서는 상수의 주소를 비교해서 동치성을 체크하게 된다.

 

 

'study > algorithm' 카테고리의 다른 글

프로그래머스/Java - 더 맵게(level 2)  (0) 2021.04.17