MySql 서버를 재시작 하고 싶은데 The server quit without updating PID file 오류가 발생하면서 안될 때가 있다.

$ mysql.server restart
Shutting down MySQL
. ERROR! The server quit without updating PID file (/opt/homebrew/var/mysql/iain-ui-MacBookPro.local.pid).
 ERROR! Failed to stop running server, so refusing to try to start.

대충, 서버가 PID파일을 업데이트 하지 않고 종료되었다는 메세지이다.

그리고 서버 실행을 멈추지 못했으므로 서버 재시작을 거부한다고 한다.

내 경우에는 mysql.server stop을 먼저 실행해주고 나서 mysql.server restart를 하면 성공적으로 진행이 됐다.

$  mysql.server stop
Shutting down MySQL
. SUCCESS!
 $ mysql.server restart
Shutting down MySQL
. SUCCESS!
Starting MySQL
. SUCCESS!

그러나 위 방법으로 해결이 안될 때를 대비하여 에러 해결법을 적어둔다.

 

 

 

 

컴퓨터에서 실행 중인 MySQL 프로세스 확인하기. 터미널에서 아래 코드를 실행한다.

ps -e | grep mysql

 

그럼 이렇게 결과가 나오는데, 실행중인 프로세스들이 있다는 뜻이다.

 

실행 중인 프로세스를 종료하기 위한 구문

kill -9 <PID>

PID란 맨 왼쪽의 다섯자리 숫자이다. 위 캡쳐에서는 83773, 83872, 83970이 되겠다.

PID를 이용하여 실행중인 프로세스들을 차례로 kill하고 다시 시작해보면 되겠다.

 

PID란 Process Identification의 약자이다. 프로세스가 실행된 후 종료될 때까지 시스템이 프로세스를 고유하게 식별하도록 하는 '프로세스 식별자'이다.

 

 

참고 : https://sebhastian.com/starting-mysql-error-the-server-quit-without-updating-pid-file/

숫자로만 이루어진 배열이 있을 때, 배열의 처음부터 끝까지 모두 합산하는 코드인데 3가지 방식으로 짤 수 있다.

첫째는 for문을 사용

두번째는 reduce라는 array의 메소드를 사용

세번째는 재귀함수 방식을 이용하는 것이다.

코드와 실행결과는 아래와 같다.

 

지금은 내일 pair준비하기 바빠서 자세한 설명은 생략한다.

 

 

 

 

<복사 & 붙여넣기용 소스>

 

// 1번 - for문

function arrSum1(arr) {

    let sum = 0;

    for (let i = 0; i < arr.length; i++) {

        sum += arr[i];

    }

    return sum;

}

 

// 2번 - reduce 활용

function arrSum2(arr) {

    return arr.reduce((acc, cur) => acc + cur);

}

 

// 3번 - 재귀함수

function arrSum3(arr) {

    if (arr.length === 0) {

        return 0;

    }

    return arr.shift() + arrSum3(arr)

}

 

 

let arr = [ 1, 2, 3, 4, 5, 6 ]

 

// 각 함수의 실행결과

arrSum1(arr) // 1번 for문

arrSum2(arr) // 2번 reduce활용

arrSum3(arr) // 3번 재귀함수

 

변수를 선언한다는 것은 컴퓨터 저장소(메모리)에 변수를 위한 자리를 만들라고 명령하는 것과 같다.

그리고 할당하는 것은 그 자리에 값을 집어넣는 것이다.

 

let item = '노트북'

 

이 구문은 item이라는 변수의 자리를 저장소에 만들고, 거기에 '노트북'이라는 데이터를 집어넣는다는 의미이다.

 

변수를 선언할 때는 몇가지 주의할 것이 있다.

변수 선언에 사용되는 키워드는 var, let, const가 있다.

먼저 var와 let의 차이부터 알아본다.

 

scope란 변수가 관할하게 되는 지역을 말한다.

let은 자기가 속한 지역에서 적절히 scope를 가진다.('적절히'라고 표현한 것은 상황에 따라 scope가 좁아지기도 하기 때문. 앞서 scope 글에서 본 바와 같이.)

그런데 var는 전역변수로 선언이 된다.

 

그럼 무조건 전역변수로 선언되는 var를 사용하면 편하지 않을까 생각될수도 있지만, 개발을 하면서 모듈을 끌어와서 써야 할 많은 경우가 생길텐데 그 때 해당 모듈 내에 이미 선언되어 있는 같은 이름의 변수와 겹쳐 문제가 될 수 있다.

var는 중복 선언으로 인한 에러 메시지도 내지 않기 때문에 문제가 생겨도 어디서 생겼는지 알아차리기 어렵다.

 

그런 이유로 let을 사용한다. let은 var와 달리 적절하게 전역 지역 scope를 갖게 되며, 혹시 같은 scope안에서 중복선언되면 에러 메시지를 출력하기 때문이다. 그래서 var보다 안정적이다. 훨씬.

 

 

제목이 엄청 길다. 제목을 뭐라고 지어야 할지 아직 잘 모르겠다. 태어나서 처음하는 블로그다보니...

어쨌든 저 긴 제목을 풀어쓰자면,

여러 객체들을 가진 배열을 입력받아 내가 원하는 특정한 값들만 골라서 합산해야 할 필요가 있는 경우이다.

 

모 학원 수강생들 데이터

예를 들자면 이런거다. 이렇게 모 학원의 수강생들이 기록된 데이터가 있다고 치자.

전체적으로 배열이고 그 안에 각 학생의 '이름 / 소속반 / 출석일수'가 객체 형태로 들어있다.

그런데 반을 두개, 세개씩 신청해서 다니는 학생들이 있다. 그 학생들의 총 출석일수를 알고 싶은 것이다.

#1. 모범답안에 가까운 코드

 

#2. 이번에는 엄청나게 압축해서 써보았다.  위 코드와 동일한 결과를 가져오지만 작동방식은 살짝 다르다. 가독성 면에서는 좋다고 할 수 없을 것 같다.

 

위의 두 코드는 동일하지만 작동방식이 살짝 다르다.

 

 

코드 실행 결과

위 두 코드중 아무거나 실행하면 이렇게 각 학생의 총 출석일수를 반환한다.

과목을 월로 바꿔서 1년동안의 출석일수를 알아본다거나, 출석일수를 수강료로 바꿔서 총 수강료 금액을 합산한다던지, 학생별 성적의 평균을 낸다던지 등등 다양하게 응용할 수 있을 것 같다.

 

<복붙용 코드>

// data
let students = [
{ name: '김엘라', class: '농구', days: 8 },  
{ name: '김현지', class: '축구', days: 9 },  
{ name: '이아인', class: '뮤지컬', days: 11 },  
{ name: '이혜성', class: '농구', days: 7 },  
{ name: '김엘라', class: '논술', days: 4 },  
{ name: '송지우', class: '논술', days: 10 },  
{ name: '박은지', class: '발레', days: 11 },  
{ name: '김엘라', class: '발레', days: 7 },  
{ name: '김현지', class: '뮤지컬', days: 3 },  
{ name: '이혜성', class: '축구', days: 9 },  
{ name: '이지현', class: '논술', days: 10 },  
{ name: '이혜성', class: '뮤지컬', days: 10 },  
{ name: '송지우', class: '컴퓨터', days: 8 },  
{ name: '김엘라', class: '피아노', days: 8 },  
{ name: '이아인', class: '컴퓨터', days: 10 },  
{ name: '박은지', class: '컴퓨터', days: 9 },  
{ name: '송지우', class: '발레', days: 9 },  
{ name: '이혜성', class: '컴퓨터', days: 11 },  
{ name: '이지현', class: '피아노', days: 10 },  
{ name: '김현지', class: '발레', days: 8 },  
{ name: '주헤라', class: '논술', days: 7 },  
{ name: '송지우', class: '축구', days: 10 },  
{ name: '박은지', class: '피아노', days: 9 },  
{ name: '김현지', class: '컴퓨터', days: 10 }, 
{ name: '주헤라', class: '발레', days: 9 },  
]
// 코드 1

// 학생에 대한 정보가 담긴 객체들로 이루어진 배열 students와 학생이름 person을 입력받는다
// 각 객체의 'name' 속성값이 person과 일치할 때 학생의 출석일수 days를 합산하여 리턴한다.
function managementClass2(students, person) {
  const sum = students.reduce(function (acc, cur) {
    if (cur.name === person) {
      return acc + cur.days;
    } else {
      return acc;
    }
  }, 0);  // reduce 일반 함수에서 initialValue 넣기
  return sum;
}
// 코드 2. 위 코드와 같은 결과를 출력한다.

// 한줄로 줄여보았다. 
function managementClass(students, person) {
  return students.filter(el => el.name === person).map(el => el.days).reduce((acc, cur) => acc + cur, 0) 
  // reduce 화살표 함수에서 initialValue 넣기
}

 

 

눈이 아파서 넣어요 눈이 아파서 ㅠㅠ

DOM이란?

Document Object Model의 약자이다.

HTML 엘리먼트들을 자바스크립트로 자바스크립트 객체처럼 조작 할 수 있는 개념이다.

 

<script src="script.js"></script>

 

위 처럼 자바스크립트 파일을 불러오는 구문을 HTML문서내에 추가하여 실행할 수 있다.

script.js 파일 내에 기술된 자바스크립트 명령어로 HTML문서 내 요소를 제어하는 것이다.

 

위 구문을 집어넣을 때는 HTML내의 <head></head> 내부나 아니면 </body>의 직전에 추가한다.

그 이유는 자바스크립트 파일은 불러들이는 즉시 실행되며, HTML문서는 위에서부터 아래로 내려가며 실행되기 때문이다.

 

 

예를 들어 script.js 파일을 이렇게 작성하였다고 하자.

script.js 파일  - [소스 0]

이 파일을 <head></head>내부에서 불러오면, 2번째 콘솔로그는 제대로 출력되지 않는다.

1) <head></head> 안에 넣기  - [소스 1]

결과 : 

2번째 콘솔이 제대로 실행되지 않았다.

불러와야 할 #msg요소가 등장하기 이전에 자바스크립트가 먼저 실행되버리기 때문이다.

자바스크립트가 실행되는 시점에는 아직 #msg요소가 없다.

 

그래서 위같은 경우는 이렇게 짜야 한다.

2) </body> 직전에 넣기  - [소스 2]

이렇게 <body>태그가 끝나기 직전에 자바스크립트 호출을 넣는다면 두번째 console.log까지 제대로 출력된다.

결과 : 

2번째 콘솔이 제대로 실행되고 있다.

 

그러므로 코드에 따라 적절하게,

1) <head></head>안에 넣던지,

2) <body></body> 마지막에 추가하도록 해야 한다.

 

 

 

[소스 0] script.js 파일

console.log('Hello World!'); //1번째 콘솔로그

let msgElement = document.querySelector('#msg');
console.log(msgElement); //2번째 콘솔로그

 

[소스 1] <head></head> 내에 추가

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
    <!-- script 요소 삽입 위치 -->
    <script src="script.js"></script>
  </head>
  <body>
    <div id="msg">Welcome~!</div>
  </body>
</html>

 

[소스 2] <body></body> 마지막에 추가

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
  </head>

  <body>
    <div id="msg">Welcome!</div>
    <!-- script 요소 삽입 위치 -->
    <script src="script.js"></script>
  </body>
</html>

 

이 이미지는 본문의 내용과 전혀 상관없습니다. 코딩하다 눈이 아프면 한번씩 보기 위해 넣습니다.

위 사진은 본문의 내용과 아무 상관 없습니다. 단지 눈이 좀 편하고 싶어서 퍼왔음.

 

 

scope란? 변수의 유효범위를 말한다.

유효범위가 무엇일까? 바로 변수가 영향력을 발휘할 수 있는 지역이다.

이 지역 밖에서는 그 변수는 없는 것이나 마찬가지이다.

즉, 변수는 자기 scope 안에서만 유효하다.

 

아래 예시를 보면 함수 밖에도 strawBerry 변수가 선언되고 있고 함수 안에도 strawBerry 변수가 선언되고 있다. 구분을 위해 색깔을 달리 입혀보았다.

둘다 똑같은 이름 strawBerry 이다. But, 둘은 서로 다른 변수이다.

 

그것을 어떻게 알 수 있는가?

 

사실 const는 변수 선언, 할당이 단 한번밖에 허용되지 않는다.

만약 const로 똑같은 변수를 한번 더 선언, 할당한다면 Uncaught SyntaxError: Identifier 'strawBerry' has already been declared 라는 에러메세지가 뜬다. 즉, 이미 선언된 변수니까 다시 선언하지 말라는 거다.

그런데 아래 코드를 실행하면 그런 에러가 뜨지 않는다.

둘은 서로 다른 변수이기 때문이다.

왜 똑같은 strawBerry 라는 이름을 사용하는데 서로 다른 변수라는 것일까?

위에서 말한대로, 둘은 서로 다른 지역(범위 = scope)를 갖고 있다.

 

1번 줄의 '스트로베리' 변수와 4번 줄의 '스트로베리' 변수는 서로 다른 변수이다.

 

 

<복사 & 붙여넣기를 위한 코드>;

const strawBerry = 1;

function test () {
  const strawBerry = 0;    // 여기서의 strawBerry 변수는 함수 밖의 strawBerry 변수와 서로 다른 변수임.
  console.log(strawBerry);
}

test();    // 0
console.log(strawBerry);    // 1

 

 

 

위 코드를 실행해보자.

 

그럼 이렇게 된다.

위 코드의 실행결과를 보면 유효범위(scope)가 다른 변수의 생태를 더 확연히 알 수 있다.

 

크롬 브라우저 콘솔창에서 실행한 결과, 함수 안에서 선언 할당된 strawBerry변수는 0, 함수 밖에서 선언 할당된 strawBerry변수는 1을 값으로 가지고 있다.

즉 서로 유효범위가 다른 변수들끼리는 서로 터치하지 않는다. 각각 독립된 구역을 차지하고 있다.

하나는 함수 밖 땅을 차지하고 있고 하나는 함수 안 땅을 차지하고 있다.

이것이 scope이다. 변수의 유효범위. 변수가 차지하는 구역.

 

 

# (내가) 알기 쉽게 설명하는 게 목표입니다. 그래서 변수명도 내맘대로 설명도 내가 생각하는대로 임.

+ Recent posts