목록전체 글 (389)
만족
Data Modeling을 위한 기본 개념에 무지하다면 아래 포스트를 읽어보고 오는 것을 추천한다. https://satisfactoryplace.tistory.com/232 [Database] Data Modeling (ER Modeling) 관계형 DB를 설계할 때 가장 많이 사용되는 기법으로 ER Modeling이 있다. ER Modeling은 이름에서부터 알 수 있듯이, Entity와 Relation을 이용해 현실 세계를 묘사한다. Entity Entity는 개체라고도 하며, 단독 satisfactoryplace.tistory.com Attribute ER 다이어그램이 Entity를 위와 같이 표현한 것과 달리, Crow Foot Notation에서는 아래와 같이 표현한다. 개체 표현이 더 간소화..
관계형 DB를 설계할 때 가장 많이 사용되는 기법으로 ER Modeling이 있다. ER Modeling은 이름에서부터 알 수 있듯이, Entity와 Relation을 이용해 현실 세계를 묘사한다. Entity Entity는 개체라고도 하며, 단독으로 존재할 수 있으며 다른 개체와 구별되는 object이다. 개체는 이름과 애트리뷰트를 갖는다. 이름은 개체의 이름이고, 애트리뷰트는 개체가 가질 수 있는 속성이다. 예를 들어, 사람이라는 개체는 성별, 나이, 키, 몸무게라는 애트리뷰트를 가질 수 있다. Attribute 첫 번째로 애트리뷰트는 단순 애트리뷰트와, 복합 애트리뷰트로 나눌 수 있다. 가령 사람의 나이라는 애트리뷰트는 더 이상 나눌 수 없는 단순 애트리뷰트이지만, 사람의 거주지 주소라는 애트리뷰트..
sudo(super user do) sudo는 슈퍼유저 권한으로 특정 작업을 수행한다. 그러나 슈퍼유저가 할 수 있는 모든 동작을 할 수 있는 것이 아니라, 일부 허용된 동작에 관해서만 사용이 가능하다. sudo su root계정으로 전환한다. root계정은 실제로 최고 권한을 가지고 있기 때문에 모든 동작이 가능하다. sudo vs sudo su ... 소유자가 root이고 권한이 771(other: 읽기만 가능)인 어떤 파일(file.txt)이 있다고 해보자. 이 때 그 파일을 수정하려 했을 때, root가 아닌 계정에서 sudo echo "test" > file.txt를 하면 Permission denied상태가 된다. sudo su를 하고 echo "test" > file.txt를 하면 소유자와 ..
대학교 ecampus 플랫폼인 HelloLMS 플랫폼에서의 사소한 버그와 해결방안에 대해 알아보자. 많은 학교에서 해당 플랫폼으로 ecampus를 운영하고 있다. 그럼에도 불구하고, 코로나가 터지고 비대면이 시작된지 1년 4개월 정도가 지났으나 지적되었던 문제점들이 전혀 개선되지 않고 있다. 강의 듣기, 강의자료 다운로드, 로그인 불가능 문제 나는 2021년 1학기에 복학을 했는데, 학기초부터 생긴 문제가 여전히 계속 발생하고 있다. 특정 상황에서 버튼을 눌러도 아무런 반응이 없다는 것인데, 조사해 보니 프로토콜 미통합 문제였다. 모던 브라우저에서는 http와 https의 혼용을 일정 부분 허용하지 않는다. 그런데 해당 사이트에서는 http와 https를 섞어서 사용해 이런 문제가 발생한다. 가령 사이트..
aws lightsail 을 사용 중 메모리 사용률이 100%에 매우 근접하게 되면 시스템이 아예 서버리는 문제가 발생되었다. (그래프가 끊긴 시점에서 전혀 서버가 응답하지 않았다) 특히 크롤링 작업을 할 때나, 사용자 수가 급증할 때 발생하는데 해결법은 aws lightsail console로 입장해 서버를 재시작하는 방법밖에 없는 데다가 재부팅 시간도 길기 때문에 서비스 품질 면에서 이는 매우 좋지 않은 경우다. 특히 저가형 VPS를 사용중일 경우 DB와 Web Server만 구동시키더라도 메모리 부족 현상이 금방 나타나고, 여기서 시스템 다운과 정상 작동 사이에서 아슬아슬한 줄타기를 하게 된다. Memory Swap 설명하기 전에 잠시 운영체제 관련 지식에 대해 설명할 것이다. 고전 OS들은 물리적..
mysql 모듈을 사용하던 중 발생한 오류이다. 동일한 코드였으나 어느 순간 갑자기 이 오류가 발생하기 시작했는데, 문제는 AFTER_FATAL_ERROR이라면서 이전에 오류는 찍히지도 않았다. 모듈 버전이나 노드의 버전이 바뀌면서 뭔가 변경점이 생긴 것 같다. 원인 메시지 원인처럼 쿼리 실행 전 커넥션에 무언가 치명적인 오류가 생긴 경우이다. 찾아보니 커넥션이 이루어진 후 일정 시간동안 쿼리가 발송되지 않으면 자동으로 커넥션이 종료된다고 한다. 커넥션이 끊긴 후 쿼리를 보내려고 하니, 위와 같은 오류가 발생하는 것이다. 해결법 커넥션이 끊기지 않게 하기 위해 코드블럭을 다음과 같이 변경한다 const preventClosingConnection= ()=>{ database.query('SELECT 1'..
하단의 탭 레이아웃의 탭들이 가로를 꽉 채우지 않는 문제가 발견되었다. 재미있는 점은 스마트폰에서는 정상적으로 표시되지만, 태블릿에서만 이렇게 쪼그라든다는 점이다. 해결법 기존의 TabLayout에 몇 가지 속성만 추가하면 된다. 이런식으로 tabGravity, tabMode, tabMaxWidth 속성을 추가해준다. 이제 태블릿에서도 정상적으로 표시된다.
해결법 1 AndroidManifest.xml 에 INTERNET 권한이 선언되었는지 확인한다. 인터넷 권한이 없을 경우 캐시로만 페이지를 로드하게 되는데, 이렇게 되면 방문한 적이 없는(캐시가 없는)페이지에서는 전부 ERR_CACHE_MISS가 발생한다. 해결법 2 binding.apply { webview.webViewClient= WebViewClient() webview.settings.javaScriptEnabled= true webview.settings.builtInZoomControls= true webview.settings.defaultTextEncodingName= "utf-8" //캐시 모드 변경 webview.settings.cacheMode= WebSettings.LOAD_CAC..
CPU/GPU 쿨러는 크게 공기를 이용해 열을 식히는 공랭쿨러와 물을 이용해 열을 식히는 수랭쿨러가 있다. 공랭쿨러의 원리 공랭쿨러는 CPU와 맟닿은 히트파이프로 열을 전달받아 선풍기로 열을 식히는 원리다. CPU 히트파이프 선풍기 구조로 되어 있다. 열은 CPU-> 히트파이프로 전달되고, 선풍기로 히트파이프에 있는 열이 식으면서 CPU의 온도를 낮춘다. 수랭쿨러의 원리 수랭쿨러는 공랭쿨러에 물과 파이프가 추가된다. CPU 히트파이프 파이프(안에 물이 들어있다) 워터펌프 선풍기 구조로 되어 있으며, 물을 이용해 냉각하기 때문에 공랭쿨러보다 가격은 더 비싸지만 쿨링 성능이 훨씬 뛰어나다 쿨링 성능 비교 www.researchgate.net/figure/Temperature-comparison-of-thre..
실험 제품은 WD SN750 500G(NVME) 이다. 비교적 크게 성능 저하가 일어난다. 그러나 SATA SSD와 NVME를 모두 써본 사람은 알겠지만, 둘의 차이를 큰 파일 읽기/쓰기를 제외하고는 실 사용에서 느끼기는 어렵기 때문에 사실상 거의 체감되지 않는다고 봐도 무방하다.
부팅 파티션을 암호화하려니 다음과 같은 에러가 발생했다. 해결법은 다음과 같다 gpedit.msc를 실행하고 위 경로로 들어간다. 시작 시 추가 인증 요구 항목을 "사용"으로 바꾼다. 이제 사용할 수 있다.
이전에 사용하던 SSD는 250GB에 SATA방식이였는데 약 5년간 잘 사용했다. 그런데 간헐적으로 블루스크린이 떠서 부팅에 아예 진입하지 못하는 경우도 있었고, 요즘 나오는 게임들은 용량이 커서 이제 256은 부족하다고 판단했다. 선택한 제품은 WD BLACK SN750 500GB 제품이고, 디램도 달려있고 나름 평이 좋길래 선택했다. 시리얼은 노출되면 안 될것 같아서 대충 가렸다. 처음에 받은 제품이 불량품이라 교환받고 하느라 일주일정도가 녹아버렸지만... 시험기간이였으니 어차피 시간도 없고 해서 그냥 넘어가기로 했다. 아무튼... MSI B350M을 사용중인데, 얘는 그래픽카드를 들어내면 M.2슬롯이 보인다. 장착해주고, easeus를 통해 기존에 사용하던 SSD를 복제했다. www.easeus.c..
가장 먼저 해야할 일은, 해당 포트가 작동하는지부터 체크해야 한다. 윈도우 10을 사용중이라면, 연결했을 때 연결 효과음이 발생하는데, 장치를 연결했을 때 해당 소리가 켜지는지를 확인한다. 만약 켜지지 않는다면 해당 포트가 고장났을 수 있으므로, 다른 USB 포트에 케이블을 연결한다. 소리까지는 났다면 좌측 하단 윈도우 아이콘 옆에 있는 검색 버튼을 클릭해 "장치 관리자"를 검색한다. "범용 직렬 버스 컨트롤러"를 누르고, "Apple 어쩌고~"하는 장치가 있고 아이콘에 노란 느낌표가 발생한다면, 드라이버 설치에 문제가 생긴 것이다. 해당 장치를 우클릭해서, 디바이스 제거를 선택하고, "드라이버도 함께 제거"에 체크한 뒤 확인을 눌러 제거한다. 케이블을 다시 연결하면 재설치되어 정상적으로 작동한다. 장치..
부속질의문(Sub-query): 다른 SELECT 문에 포함되어지는 SELECT 문 중첩질의문(Nested-query): 하나 이상의 부속질의문을 포함하는 SELECT 문 SELECT * FROM ( SELECT * FROM Person WHERE city='서울' ) P WHERE name='홍길동'; => 서울에 사는 사람들 중 이름이 홍길동인 사람 모두 출력 에서 붉은색이 중첩질의문, 초록색이 부속질의문이다. 너무 용어에 얽메일 필요는 없다. 주의할 점은 부속질의문의 결과를 외부에서 사용(참조)하고자 할 때는 반드시 부속질의문에 Alias를 붙여주어야 한다는 점이다 SELECT 절의 부속질의문 SELECT city, (SELECT count(*) FROM Person ip WHERE ip.perso..
조인에 개념에 대해 아예 무지한 상태라면 아래 포스트를 읽고 오는 것을 추천한다. satisfactoryplace.tistory.com/201?category=933598 [Database] 관계대수 (Relational Algebra): 조인(JOIN), 외부 합집합(OUTER UNION) 세타조인, 동일조인, 자연조인, 세미조인, 외부조인에 대해 알아보자. 조인은 기본적으로 두 개의 릴레이션에 대해 진행하는 연산으로 이항 연산자이며, 두 개의 릴레이션에서 공통된 애트리뷰 satisfactoryplace.tistory.com SQL에서 조인은 2개 이상의 테이블에 대해 특정 조건을 만족하는 rows끼리 결합하여 새로운 테이블을 만드는 연산이다. 이 때 대상 테이블은 서로 같을 수도 있고, 다를 수도 있..
집계함수: Aggregation 집계 함수는 말 그대로 어떤 열에 대해, 여러개의 행을 집계한 값을 반환한다. SELECT COUNT(*) FROM student; 와 같이 사용하면 결과값의 행은 1개이고, 거기에 student 행의 갯수를 출력한다. count(*) 3 단, 집계 함수를 사용하면 SELECT 출력에서 일반 열은 사용할 수 없고 집계 함수만 사용할 수 있다. 집계 함수의 종류 MAX(열 이름): 해당 열의 최댓값 출력 AVG(열 이름): 해당 열의 평균값 출력 MIN(열 이름): 해당 열의 최솟값 출력 등 여러가지가 있다. 집계 함수에서 DISTINCT 단순히 집계함수(열 이름)하면 모든 열에 대해 계산한 값을 하나의 행에 전달한다. category hospital_name city 정형..
이번에는 열 이름 위치에 추가적으로 사용할 수 있는 DISTINCT와 ALIAS에 대해 알아보겠다. DISTINCT 해당 열의 중복을 제거하는 방법이다. 가령 학교 학생의 과 정보를 저장하는 major 테이블이 아래와 같다고 해보자 student_id major_name 1234 컴퓨터공학 1234 화학공학 9999 기계공학 8888 전자공학 이 테이블에서 학번 리스트를 중복 없이 뽑고 싶다면 SELECT student_id FROM major; 가 아닌 SELECT DISTINCT student_id FROM major; 를 사용해 중복되는 student_id(1234)를 한 번만 표시할 수 있다. ALIAS 열 이름이 지저분하다거나, 테이블 형태를 바꿀 수 없는데 열 이름이 부적절한 상황, 두 개 이..
셀렉트는 일정 조건에 따라 새로운 테이블을 만드는 키워드이다. SELECT 열이름[, 열이름2, ...] FROM 테이블이름 [WHERE 조건식1 ...] [ORDER BY 열이름 [ASC|DESC]] [LIMIT 출력행갯수]; 일단 간단한 서식은 위와 같다. ([]는 생략 가능하다) student_id student_name 1 홍길동 2 길동홍 3 동홍길 (student 테이블) SELECT student_name FROM student; student_name 홍길동 길동홍 동홍길 (쿼리 실행 결과; 열 이름에 student_name만 입력했기 때문에 위와 같이 나온다) WHERE 조건식 WHERE 조건식 을 나열하여 원하는 row만 출력할 수도 있다. SELECT student_name FROM ..
테이블의 생성: CREATE CREATE TABLE 테이블이름( 열이름1 타입 [키 타입] [기본값] [on update 값], 열이름2 타입 [키 타입] [기본값] [on update 값], ... [constraint 제약사항 이름 check(조건식)], ... ); []로 된 부분은 선택사항이다. 위 문법을 이용해 간단한 테이블을 생성해보자 CREATE TABLE student( student_id integer PRIMARY KEY, student_name varchar(3) NOT NULL, semester int integer DEFAULT 1, enter_date datetime DEFAULT NOW() ON UPDATE NOW(), constraint SEMESTER_CONST check(..
셀렉트, 프로젝션은 릴레이션을 피연산자로 갖는 단일 연산자이고, 디비전은 두개의 릴레이션을 피연산자로 갖는 이항 연산자이고, 반환하는 값은 모두 하나의 릴레이션이다. 셀렉트(SELECT) 시그마 기호σ, 조건(선택), 피연산자로 이루어진 단일 연산자이다. 주어진 릴레이션에 대해 원하는 조건을 만족하는 튜플을 뽑아 새로운 릴레이션을 만든다. σ이름='홍길동'(국민) 하면 이름 주민등록번호 홍길동 123456-1234567 홍길동 234567-2345678 처럼 나온다. 결과값은 피연산자의 튜플 갯수보다 작거나 같다. 프로젝션(PROJECTION) 프로젝션 기호∏, 애트리뷰트 집합, 피연산자로 이루어진 단일 연산자이다. 주어진 릴레이션에 대해 각 튜플에서 원하는 애트리뷰트 집합으로만 이루어진 새로운 릴레이션..