오랜만에 MariaDB root 계정으로 로그인해야하는 일이 생겼는데,, 거의 2년만에 로그인 하는거라 비밀번호를 까먹었다.
나 말고도 많은 사람이 비밀번호를 자주 까먹는 것 같아서 어떻게 초기화 할 수 있는지 공유하고자 이 글을 쓴다.
일단, MariaDB를 종료시켜야 한다.

$ sudo systemctl stop mariadb
$ sudo systemctl stop mysql

이후에 mysql을 안전모드로 시작해야 한다. 그 이유는 비밀번호를 사용하지 않고 접속하기 위해서임! (이때 뒤에 & 문자를 붙이는 이유는 프로세스를 백그라운드에서 mysql이 동작하게 하는 리눅스 명령어임. 그냥..ㅋㅋ 은근 모르는 사람 많길래..)

$ sudo mysqld_safe --skip-grant-tables &

실행했으면, root 계정으로 실행시켜주자.

$ mysql -u root

MariaDB가 정상적으로 실행되면 안전모드 진입에 성공했다! 와!(짝짝짝)
이제 계정 초기화를 해 주면 된다.

$ mysql > SET PASSWORD FOR 'root'@'localhost' = PASSWORD('PASSWORD');

만약 다음과 같은 오류가 발생하면, 다음 명령어를 실행해주고, 다시 비밀번호를 설정하면 된다.

The MariaDB server is running with the --skip-grant-tables option so it cannot execute this statement

$ mysql > flush privileges;
$ mysql > SET PASSWORD FOR 'root'@'localhost' = PASSWORD('PASSWORD');
$ mysql > flush privileges;

이제 비밀번호 재설정이 완료됐다! 백그라운드에서 실행중인 mysqld_safe를 종료시키고, MariaDB를 재시작 하면 정상적으로 내가 설정한 비밀번호를 통해 로그인 할 수 있다.
간혹, SET PASSWORD ... 질의문으로 비밀번호 변경이 안된다면, 다음 질의를 실행해보라

$ mysql > ALTER USER 'root'@'localhost' IDENTIFIED BY 'PASSWORD';

 

쉬운건 빨리빨리 풀자!

쉬운건 빨리빨리 풀자!

다음은 사분면을 구분하는 문제인데, 사분면은 우리가 수학적 지식이 있으면 쉽게 알 수 있으니, 바로 정리하겠다.

x가 양수이면 1 또는 4사분면이다.
y가 양수이면 1 또는 2사분면이다.

정리가 끝났다! 해당 문제를 풀기 위해 배열을 사용할 것이다. 조건문을 쓰면, 너무 중첩되어야 해서 귀찮다.

배열의 크기는 2며, x를 먼저 판별하여 0번에는 작은 사분면이, 1번에는 큰 사분면을 넣을 것이다. 설명하자면, x > 0일 경우, result[0] = 1, result[1] = 4 이고, x < 0일 경우, result[0] = 2, result[1] = 3이 될 것이다.

이후에, x>0에서 y가 양수라면, 정답은 1일 것이고, y가 음수라면, 정답은 4가 될 것이다.

전체 코드는 다음과 같다.

import java.util.Scanner;

public class Number14981 {
	public static void main(String args[]) {
		try(Scanner scan = new Scanner(System.in)){
			int result[] = {1, 4};
			int x = scan.nextInt();
			if(x < 0) {
				result[0] = 2;
				result[1] = 3;
			}
			int y = scan.nextInt();
			
			System.out.println( (y > 0 ? result[0] : result[1]) );
		}
	}
}

 

오늘은 백준 2단계 if문의 2753번 윤년과 관련된 문제를 풀이할거다.

if문과 관련된 문제는 주제 그대로 조건문을 잘 활용하면 된다. 특히 2753번의 경우, 조건이 이미 적혀있기 때문에, 크게 어려운 문제는 아니다.

제일 첫 조건에 대한 문장을 보면 다음과 같이 정리할 수 있다.

조건
(년도가 4의 배수다.) AND (100의 배수가 아니다. OR 400의 배수다.)

해당 조건만 보면 100의 배수가 아닌데 400의 배수가 어떻게 걸리는지 잘 모르겠다. (400은 100의 배수이고, 100은 또한 4의 배수이기 때문에..)

하지만 그 다음 문장을 보면 그 말을 확실하게 이해할 수 있다. "1900년은 100의 배수이지만, 400의 배수가 아니라 윤년이 아니다."

즉, 100의 배수면서 400의 배수인 연도는 윤년인 걸 알 수 있다.

또한 "2012년은 4의 배수면서 100의 배수가 아니기 때문에 윤년이다."를 보면, 100의 배수면 윤년이 아닌걸 알 수 있다.

따라서 조건은 다음과 같이 재정리 된다.

조건
1. 4의 배수고, 100의 배수가 아니면 윤년이다.
2. 4의 배수고, 100과 400의 배수면 윤년이다.

이 때, 두 조건에 공통적으로 있는 4의 배수여야 한다를 하나의 조건으로 추가할 것이고, 따라서 다음과 같이 변한다.

조건
0. 4의 배수다.
그리고
1. 100의 배수가 아니면 윤년이다.
혹은
2. 100과 400의 공약수면 윤년이다.

이 둘은 AND 연산이 아니고 OR연산인 것은 모두가 알 수 있을거라 생각한다.

1, 2번 조건 모두 나머지 연산을 통해 구할 수 있다.

1번의 경우, 연도를 (4 * 100)으로 나눴을 때 나머지가 0이어야 하고, 2번의 경우 4로 나눴을 때 나머지는 0이지만, 100으로 나눴을 때 나머지가 0이 아니면 된다.

따라서 전체 코드는 다음과 같다.

import java.util.Scanner;

public class Number2753 {
	public static void main(String args[]) {
		try(Scanner scan = new Scanner(System.in)){
			int year = scan.nextInt();

			boolean baseCondition = (year % 4 == 0);
			boolean firstCondition = (year % 100 != 0);
			boolean secondCondition = (year % 100 == 0) && (year % 400 == 0);

			if(baseCondition && (firstCondition || secondCondition)) {
				System.out.println("1");
			} else {
				System.out.println("0");
			}
		}
	}
}

이런..

아.. 왜자꾸 같은 실수를 하는지 모르겠다..

compile error는 Scanner를 import 시키지 않았고, 중간에 틀린건 내가 확인하려고 만들어노는 println문을 지우지 않아서 출력 형태가 정답과 달랐다.. ㅋㅋ..

ㅋㅋ..이런.. 해당 println문을 지우니 정답!

 

맥북.. 그 근황..

맥북 교체를 위하여 애플에서 7월 1일 내게서 부터 제품을 가져갔다. 그로부터 6일이 지난 7월 7일, 새로운 제품이 내게 발송되었다.

 

[MacbookAir M1] 맥북 에어 개봉기

애플 공홈 주문 DHL 배송... 애플 교육할인 스토어에서 18일날 맥북 에-어를 주문했다. 19년 그램 중고 가격이 꽤 잘 나가길래, 쓰던 그램을 처분하고 맥북 에어를 구매했다. 구매 당시에 배송 예정

dev-whoan.xyz

위 글을 보면, 제품 발송일로부터 5 영업일이 지난뒤 난 제품을 받을 수 있었다.

따라서, 이번에도 나는 5 영업일이 지난 내일 13일 제품을 받아볼 수 있을거라 기대했다.

하지만..ㅠㅠ.. 4일째인 오늘까지도 아직 내 제품은.. 한국땅을 밟지 못한 듯 하다..... 흑흑...

여자친구가 맥북과 같이 쓰라고 벨킨 허브까지 사줬는데.. 아직 개봉도 못한채로 맥북을 기다리고있다..ㅠㅠㅠㅠ

언제쯤 맥북이 도착해서 맥북으로 개발을 시작할 수 있을까..

아니 이쯤되면.. 내년에 M2를 단 맥북 에어가 나온다는데..조금만 더 그램을 쓸걸.. (어차피 2학기 학교도 못가는데....)

이번 애플 공홈을 겪으며 우리나라 택배 시스템이 정말 잘 되어 있구나 라는걸 다시한번 느꼈다.....

MKWeb에 로그인 기능을 구현할 때, Session/Cookie를 이용하여 구현할지, 구현한다면 어떤 방식으로 현재의 MKWeb과 결합할 수 있을 지 많은 고민을 했다.

로그인이라는 것 자체가 꽤 민감한 부분인 만큼 해당 부분을 구현하기 위해서 많은 공부가 필요했고 21년도 1학기가 시작되었기 때문에 그러기에는 좀 바빴다.

특히 20년 8월~ 21년 7월까지 진행한(아직 진행중인) 오픈배지 프로젝트에서도 사용자의 로그인을 구현해야 했는데, 이를 통해 해당 고민을 해결할 수 있었다.

일단 세션/쿠키 방식이 아닌 Json Web Token을 이용하여 사용자 인증을 구현하려 한다.

쉽게 설명하자면, Json 형태의 어떤 정보를 Token화 하여서 서버와 클라이언트가 주고받는 방식이다.

사용자가 로그인을 시도하면, 서버에서는 아이디와 패스워드를 확인하고, 로그인에 성공했다면 사용자의 정보를 이용하여 Payload를 만든다.

또한 JWT에 사용되는 암호화 방식과 토큰정보를 사용하고있는 Header가 존재하고, JWT에 대한 서명인 Signature가 있다.

이 세 파트는 연결되어서 xxxx.yyyyyy.zzzzz와 같은 형태로 존재하게 된다.

header와 payload는 base64URL로 encoding 되기 때문에 사용자의 비밀번호 등 민감한 정보를 절대 포함해서는 안된다.


JWT를 사용하기 위해 잠깐 생각해본 방법은 다음과 같다.

컨트롤러에 대하여 상위 옵션으로 "auth"에 대하여 [ all, part, none ]과 같은 설정을 할 수 있고, all의 경우 해당 페이지(혹은 컨트롤러)는 로그인과 같은 사용자 인증이 필수인 경우.

part는 컨트롤러의 일부 서비스는 사용자 인증이 필요한 경우.

none은 컨트롤러는 사용자 인증 없이 이용 가능한 경우로 정하면 어떨까 싶다.

오늘부로 내 방학 계획표 중 노는날이 끝나고 (...) 바쁜 일상이 시작되었으니, 이번주는 조금 널널하게 하기 위해 브레인스토밍 형식으로 진행하고 있기 때문에, 사실 이 방향으로 fix 한다는 보장은 없다.

그래도 나중에 돌아봤을 때, 꽤 좋은 기록물이 되지 않을까 싶어 오늘도 글을 쓰지만..

 

'웹서버 > MKWeb' 카테고리의 다른 글

[RESTful API] MkWeb RestAPI 메모장  (0) 2021.07.31
[Authorization] MkWeb JWT를 이용한 Authorization 설계  (0) 2021.07.21
MkWeb의 Controller  (0) 2021.03.29
MkWeb이란 무엇인가?  (0) 2021.03.29
MkWeb을 시작하게 된 이유  (0) 2021.03.29

맥북이 도착하고 난 뒤부터 코딩테스트를 시작하려 했지만, 맥북이 생각보다 늦게와서 (아니 한국에 들어왔는데 왜 배송이 안되냐고..ㅠㅠ) 데스크탑으로 공부를 시작했다!

앞에 문제들은 이미 풀어져 있길래,, 2588번부터 하나하나 단계별 풀어보기를 진행할 예정이다.

오늘은! 그 대망의 첫 번째 문제인 백준 2588 A*B를 풀 것이다.


오늘의 문제

2588번 A*B를 순차적으로 출력하라!

2588번의 문제는 두 정수 A*B를 계산할 때, 계산 과정을 모두 출력하는 것이다.

이 문제를 딱 봤을 때, 정해야 할것 하나와 알아야 할 것이 두 가지가 있는 것을 알 수 있다.

정해야 할것
1. 두 정수 중 어떤 것을 베이스로 할것인가?

알야아 할것
1. 곱해지는 수는 몇자리 수 인가? (365=3자리 수)
2. 곱해지는 수의 각 자리의 값은 무엇인가? (일의 자리, 십의 자리, 백의 자리 ...)

정해야 할 것은 그냥 첫 번째 수를 베이스로 했고, 따라서 두번 째 수는 자연스럽게 곱해지는 수로 정했다.

해당 문제는 수학적 지식만 조금 있다면 바로 구할 수 있다. 나 같은 경우에는 위의 방법이 바로 떠올랐고, 이미 알고있는 방법이기 때문에 바로 문제를 풀 수 있었다. (세 번 실패한건 비밀... 첫 번째는 오타로인한 컴파일 에러.. 두 번째는 클래스 명이 Main이어야 한다는 것을 까먹고 있었고,, 따라서 틀렸다...)


1. 곱해지는 수는 몇자리 수 인가?

우선 곱해지는 수가 몇자리 수인지 알아야 한다. 우리에게 주어지는 곱의 값은 매번 달라질 것이고, 따라서 하드코딩을 통해 값을 매번 지정할 수 없기 때문이다.

예를 들어, 곱해지는 수가 한자리 수일때의 경우, 두자리 수일 때의 경우, 세자리 수일 때의 경우, ... 엄청 큰 자리수일 때의 경우 를 모두 코딩할수는 없잖아!

해당 질문은 log를 통해 쉽게 구할 수 있다. 먼저 자리수에 대해 우리가 표현할 때, 1의 자리는 다음과 같이 표현할 수 있다.

$$ n * 10^0 $$

마찬가지로 10의 자리는 다음과 같이 표현할 수 있다.

$$ n * 10^1 $$

이쯤 되면 내가 무엇을 하고자 하는지 이해 할 수 있다! 즉, 우리는 정수의 자리수를 표현하기 위해 다음과 같이 일반화 할 수 있다.

$$ n * 10^m ( m >= 0, integer ) $$

이 때, n은 우리가 표현하고자 하는 수 이고, m은 해당 숫자의 자릿수 이다.

우리는 지수를 로그로 표현할 수 있는 것을 고등학교 수학에서 배웠다.

로그와 지수의 관계

즉, 자리수를 로그를 통해 표현할 수 있는 것인데, 위의 일반화를 로그로 표현해 보면 다음과 같이 될 수 있다.

$$ m = log_10 n $$

이 때, m은 자리수가 되고, n은 표헌하고자 하는 수 이다! 그런데, log에서는 한가지 주의할 점이 있는데, log 0이 정의되지 않는 점이다.

$$ 10^m = 0 $$ log 0을 지수로 나타내었을 때 위와 같은 식이되고, 해당 식을 만족하는 m의 값은 없기 때문이다. 

따라서, 우리가 구하고자 하는 자릿수는 최종적으로 다음과 같은 식이 된다.

$$ m = {log_{10} n} + 1$$


2. 곱해지는 수의 각 자리의 값은 무엇인가? (일,십,백, ...의 자리)

이제 해당하는 m 자리의 값이 무엇인지 구하면 된다.

해당 질문은 놀랍게도 몫을 구하는 식으로 쉽게 풀 수 있다. 위에서 우리는 모든 수를 다음과 같이 표현할 수 있다는 걸 이미 인지했다.

$$ n = 10^m $$

우리는 궁극적으로 n이 무엇인지 구해야 한다. 수는 0~9까지 중 하나로 표현할 수 있고, 거기에 자릿수를 곱해주게 되면, n이 무엇인지 알 수 있다.

"그래서 도대체 0~9 중 무엇인지 어떻게 아는데?!"

우리가 어떤 수를 나눌 때, 해당 식은 다음과 같이 표현된다.

$$  N = Qx + R $$

아직도 감이 안오는가?!?!

우리가 구하고자 하는 수 N에 대하여 Q=10(몫의 밑)이고, x(몫의 배수)가 얼마든 간에 R의 범위는 0~9로 한정된다.

이 때 우리는 몫의 배수를 자리수로 해 줄 것이다. 무슨 말이냐면, 다음과 같이 나타낼 수 있다.

$$ 10^m % 10 $$

여기서 문제점은, 우리가 아무리 10 % 10, 100 % 10, 10....0, % 10을 해도 0이 나온다는 점이다. 그 이유는, 우리 본래 수를 아직 구하지 않았기 때문인데, 본래 우리가 찾고자 하는 수는 다음과 같이 구할 수 있다. 예를 들어, 385에 대하여 8을 구하고자 할 때는 다음과 같다.

$$ {385 / 10^1} % 10 = 8.5 $$

이 때, 우리가 사용하는 수는 정수이기 때문에, 8로 구해지는 것을 알 수 있다.


이제 위 두 수식을 근거로 코드를 작성해보자!

문제의 풀이 과정을 출력하기 위한 함수 하나, 그리고 메인함수 하나 하여 총 두 개의 함수를 만들 것이다.

메인 함수는 두 수를 입력받고, 풀이 과정을 출력하는 함수를 호출하며 최종적으로 두 식의 연산 결과를 출력할 것이다.

BufferedReader와 InputStreamReader를 이용하여 입력받을 수 있지만, 간단한 문제이고 메모리, 속도제한 등 아무 것도 없기 때문에 java.util.Scanner를 이용하여 두 수를 입력받을 것이다.

따라서 최종 코드는 다음과 같다.

public class Number2588{
	public static void main(String args[]){
		try(Scanner scan = new Scanner(System.in)){
			int a = scan.nextInt();
			int b = scan.nextInt();
			printNth(a, b);
			System.out.println(a*b);
		}
	}

	public static void printNth(int a, int b){
		int length = (int)(Math.log10(b)+1);
		for(int i = 0; i < length; i++){
			int tempB = b / (int)Math.pow(10, i) % 10;	// tempB 없이 바로 출력해도 된다.
			System.out.println(a * tempB);   
		}
	}
}

 

 

 

[MacBook Air] 애플 교육할인스토어 맥북 에어 불량 교환 신청 ㅠㅠ

25일에 받은 내 맥북 에어의 키판에 찍힘이 있다..!!!] 받자마자 제일 처음에만 한번 보고, 이후에 블루투스 키보드만 사용해서 키판에 찍힘이 존재하는지 몰랐다.. 그런데 한번 누워서 맥북 써봐

dev-whoan.xyz

맥북 키판에 찍힘이 있어서, 교체 요청을 한지 벌써 5일 지났다.

제품을 7월 1일에 수거해 갔는데, 수거 진행 상황또한 애플 제품 배송때 처럼 내가 알 수 없었다..

픽업을 준비하십시오..언제까지..?

애플은 내가 제품을 받든 아니면 애플로 제품을 보내든 배송할 때 마다 '와, 제품 분실됐나???' 혹은 '제품어디에 끼어서 빙빙 돌고있는거 아냐??'

마치 이것처럼....

하는 걱정이 엄청든다!!!

그런데 드디어 오늘, 내게 애플에서 메일이 왔고, 확인해보니!!

우와!!! 반품됨!!

이제 새로운 맥북이 집에 오기만을 기다리고 있다. 또다시 기다림의 시작..ㅠㅠㅠㅠ

내 생각에, 오늘 제품 생산이 들어갔으니, 내일 생산 끝(?) 배송 --> 금요일 집 도착 할 수 있는 기적이 있을 수 있지 않을까!?!?

25일에 받은 내 맥북 에어의 키판에 찍힘이 있다..!!!]

빛 각도에 따라 보였다 안보였다 한다 ㅠㅠ

받자마자 제일 처음에만 한번 보고, 이후에 블루투스 키보드만 사용해서 키판에 찍힘이 존재하는지 몰랐다..

그런데 한번 누워서 맥북 써봐야지 하고, 누워서 맥북을 여는데!!! 그 순간 넘버 4 위에 찍힘이 :O 하는 표정으로 날 바라보고 있는게 아닌가 ㅠㅠㅠㅠㅠ

그래서 쓸까 말까 고민하다가, 주변에서 새 기기이고 애플 정책상 14일 안에 묻지마 환불이 가능하다 하니 얼른 새걸로 교환해라!! 라고 조언해주는 바람에 교환신청 했다.

환불 후 재구매를 하지 않은 이유는, 첫번째로 교육할인 스토어는 환불 진행이 완료되더라도, 교육할인스토어 정책상 학년별 대수 구매 수량 제한이 있기 때문에, 제한이 풀릴때 까지 결제가 불가능하다는 안내를 받았고, 체크카드로 결제했기 때문에 환불 후 카드사에서 실제 환불이 되기까지의 딜레이를 감안했을 때 교환 진행했을 때와 별 차이가 없다는 결론이 나왔기 때문이다.

그래서, 6월 27일 애플 교육할인 스토어에 전화해서 교환절차를 신청했고, 7월 마지막주에 신제품을 받을 수 있을거라는 안내를 받았다.

그런데 내가 제품을 수령하는 날짜는 12일~14일로 찍혀있었다!

그런데 실제 애플 홈페이지에서는 내가 제품을 수령하는 날짜가 12일~14일로 찍혀있었다!

애플에서 나로부터 제품을 수거해가는 날짜가 7월 1일이었고, 애플의 제품검수팀이 환불될 제품을 검수하고, 실제 환불이 진행되는 날짜가 12일쯤이라고 안내를 받았는데, 그 즈음하여 내가 제품을 받을 수 있을거라는 안내였다.

처음에 이 문구를 확인했을때는, '그냥 오류겠지'라고 생각했는데, 얼마 지나지 않아서 다음과 같은 이메일을 받았다.

아니, 이쯤되면 오류가 아니라 진짜 12일~14일에 제품을 받아볼 수 있다는 말 아닌가?!

저때가 되어봐야 실제 제품 수령 여부를 확인할 수 있겠지만, 어쨋거나 내가 안내받은 7월 26일~28일보다 대략 2주나 빠른 기간이기 때문에, 나는 다시 한번 설레고 있다. (사실 이 게시글도 맥북으로 작성하고 있지만...)

이번에 느낀건데 맥북 정말 쫀쫀하다. 키보드 타이핑하는 맛이 있다! 단점이라면,, 한영 변환할 때, 0.4초 정도의 딜레이가 있고, 이 사이에 키를 누르면 내가 요청했던 한영환이 씹힌다. 맥OS의 문제인지, 아니면 하드웨어와의 Communication간에 문제가 있는건지(결국에 Operating System에서 사용자의 요청 IO에 대하여 적절히 처리하지 못하는거지만...) 잘 모르겠지만, 이거 빼곤 아직 다 괜찮다!

M1이 나온지 얼마 안됐기 때문에 개발 IDE(인텔리제이, 이클립스)의 반응속도 문제는 뭐.. 참아줄만하다. (일단 맥북이 너무 예쁘고, 키감이 너무 쫀쫀하고, 배터리가 너무 오래간다........ 저장용량은 뭐.. 내가 옵션을 안넣어서 어쩔 수 없는거고..)

후....새로운 맥북 또 다시 설렌다....

+ Recent posts