ERD 를 통한 데이터베이스 모델링
TL;DR ERD 는 Entity Relationship Diagram의 약자이며, 개체 관계 다이어그램 뜻 한다. Peter Chen의 박사 학위 논문에 처음 등장했다. ERD 를 통한 데이터베이스 모델링 데이터베이스 모델링을 함에 있어, 시각적 다이어그램이 좀 더 명확한 모델링을 할 수 있게 도움을 준다는 것을 많이 깨달았다. 협업함에 있어 공유되는 정보 또한 빠르게 전달할 수 도 있다. 실무에서는 ERD를 많이 작성하게 된다. Product 초기 단계에서는 특히나 많이 작성하게 되며, 잦은 구조 변경으로 업데이트도 자주하게 된다. 개인적으로 ERD 도구로써 MySQL Workbench 를 채택하여 사용하고 있다. Workbench 는 익숙하고, 무료라서 좋아한다. ERD 가 굉장히 어렵게 받아들려지곤 하는데, 절대 그렇지 않다. 매우 쉽다. 데이터와 데이터간의 관계만 나타내면 된다. 나타내는 과정에서 Relationship에 대한 여러 표기법과 식별자가 존재한다. 아래의 관계를 ERD로 표기하려면 어떤식으로 표기해야할까 ? 1:1 (일대일) 1:N (일대다) N:N (다대다) 주로 IE 표기법과 바커 표기법을 대표적으로 사용하는데, 그 중에서도 IE(Information Engineering(I/E)) 표기법을 가장 많이 사용한다. 바커표기법과 IE표기법에 대해 얘기해보자. 바커 표기법 (Baker Notation) _은 영국 컨설팅 회사 CACI에 의해...
Workbench 에서 EER Diagram enlarge 하기
배치하고자 하는 테이블의 수가 많아서 Diagram 을 확대하고자 할 때, 아래와 같이 설정하면 된다. 상단 설정 탭에서 “Model > Model Options” 을 선택 후, “Diagram” 탭을 선택한다. 그리고 하단 부, “Use defaults from global settings…” Uncheck 한다. 이 후 Apply 하고, 다시 설정 탭에서 “Model > Diagram Properties and Size” 선택 후 자신이 원하는 사이즈를 설정하면 된다.
Git 복수의 SSH Key 사용하기
여러개의 저장소를 사용하는 경우 여러개의 키를 사용해야하는 경우가 있다. 이 경우 ssh 에서 “i (identity_file)” 옵션을 통해서 매번 지정할 수 있지만 번거롭기에 ssh 설정파일을 통한 해결을 선호한다. $HOME/.ssh/config 위 경로의 설정파일을 생성한다. 아래와 같이 Host 에 따라 개인 키를 설정한다. Host github.com-youngjun    HostName github.com     PreferredAuthentications publickey     IdentityFile ~/.ssh/github-key/youngjun/id_rsa IdentitiesOnly yes Host github.com-hax0r     HostName github.com     PreferredAuthentications publickey     IdentityFile ~/.ssh/github-key/hax0r/id_rsa IdentitiesOnly yes 
Python & Selenium 을 이용한 QA 자동화
일련의 검증 절차(unit test, stress test, etc..)를 걸친 이 후, 우리는 통상적으로 프로그램을 배포한다. 그 검증 절차 중, QA(Quality Assurance) 도 포함되는데 다른 절차에 비해 상대적으로 소요되는 시간이 크다. QA는 소프트웨어 품질 보증을 말하며, 이 작업을 수행함으로써 소프웨어의 결함을 사전의 발견하여 배포 전 결함을 보안할 수 있게하는 역할을 한다. 주위에서 이 작업을 굉장히 간과하는 분들도 많지만, 실질적으로 배포 절차 중 가장 중요한 단계라 본인은 생각한다. 정해진 규격이 없다보니 팀 마다 진행하는 방법도 천차만별이다. QA 부서가 따로 존재 할 수 도 있고, 개발자가 진행하는 경우도 있다. 통상적으로 인력으로 진행하다보니 기능에 수의 따라 공수도 증가한다. 인력으로 모든 단위를 정확하고 신속하게 처리한다면 좋겠지만, 인간은 실수를 범할 가능성이 농후하다. 숙련도가 증가한다고해서 실수는 피할 수 없고, 숙련도의 핑계로 작업 단위를 건너뛰는 경우도 발생할 수 있다. 컴퓨터는 인간보다 더 날렵하고 묵묵하다. 인간이 테스트와 같은 작업을 1,000번 10,000번 수행한다고하면 실수를 범하고, 수행하는 시간 또한 천차만별일 것 이다. 하지만 컴퓨터는 주어진 자원에 따라 수행하는 시간과 수행하는 과정 일괄적일...
최고의 집합
최고의 집합 프로그래머스에 공유된 문제입니다. 문제 자연수 N개로 이루어진 집합 중에, 각 원소의 합이 S가 되는 수의 집합은 여러 가지가 존재합니다. 최고의 집합은, 위의 조건을 만족하는 집합 중 각 원소의 곱이 최대가 되는 집합을 의미합니다. 집합 원소의 개수 n과 원소들의 합 s가 주어지면, 최고의 집합을 찾아 원소를 오름차순으로 반환해주는 bestSet 함수를 만들어 보세요. 만약 조건을 만족하는 집합이 없을 때는 배열 맨 앞에 –1을 담아 반환하면 됩니다. 예를 들어 n=3, s=13이면 [4,4,5]가 반환됩니다. 풀이 def bestSet(n, s): print(n) prin(s) answer = [-1] if n > s else [] answer = [s//n] * (n - (s % n)) + [s//n + 1] * (s % n) #print(answer) return answer # 아래는 테스트로 출력해 보기 위한 코드입니다. print(bestSet(3,13)) # 아웃풋 # [4, 4, 5] # [4, 4, 5] # [5, 5, 5, 6, 6, 6, 6, 6, 6] # <EXECUTION_TIME>2975</EXECUTION_TIME>
MySQL 5.7 준비하고 계신가요 ?
개요 안녕하세요. 본 문서는 MySQL 5.7 버전의 새로운 기능과 성능 차이 그리고 5.6버전 에서의 업데이트 과정을 다룹니다. MySQL 이 세상에 나온지 20년이라는 세월이 훌쩍 넘었습니다. 오라클이 [Innobase](https://en.wikipedia.org/wiki/Innobase) 를 인수한지 10년이 넘었고, 썬 마이크로시스템즈가 MySQL AB 를 인수한지 9년이 되었네요. 지금까지의 MySQL은 개발자들의 많은 사랑과 관심을 받으며 계속 성장해왔습니다. 또 한 테크 리딩 기업들의 기여로 MySQL의 생태계는 그 어느때보다 활발합니다. MySQL 측은 공식 홈페이지를 통해 5.7 버전은 이전 버전인 5.6 과 비교 했을 때 3배 정도의 성능 차이가 있다고 말합니다. 이전의 경재사들 제품군에 비해 상대적으로 성능이 떨어진다는 이슈 제기가 많았습니다. 경쟁 의식 덕분인지 5.7버전을 기점으로 성능 관련하여 많은 공을 들였습니다. 그 뿐 아니라, New Optimizer, Native JSON support,Multi-source Replication 등의 추가 기능도 있어 개발자 입장에서는 정말 반가운 소리 입니다. 현재 시점 기준으로 8.0(5.8 MySQL 5.8 will be called MySQL 8.0)이 릴리즈 되었습니다. 8.0의 경우 AWS RDS 에서 지원 해주지 않는 관계로 5.7에 대해서만 얘기 하고자 합니다. 본 내용이 좀 더 궁금하신...
멀리 뛰기
요즘 코딩 테스트 면접 준비로 인해서, 틈틈히 알고리즘 문제를 풀고있다. 상대적으로 개인적 견해로 재밌게 푼 문제를 블로그를 통해서 공유하고자한다. 본 문제는 [programmers](https://programmers.co.kr/) 서비스를 통해서 풀이하였다. #### 문제 효진이는 멀리 뛰기를 연습하고 있습니다. 효진이는 한번에 1칸, 또는 2칸을 뛸 수 있습니다. 칸이 총 4개 있을 때, 효진이는 (1칸, 1칸, 1칸, 1칸) (1칸, 2칸, 1칸) (1칸, 1칸, 2칸) (2칸, 1칸, 1칸) (2칸, 2칸) 의 5가지 방법으로 맨 끝 칸에 도달할 수 있습니다. 멀리뛰기에 사용될 칸의 수 n이 주어질 때, 효진이가 끝에 도달하는 방법이 몇 가지인지 출력하는 jumpCase 함수를 완성하세요. 예를 들어 4가 입력된다면, 5를 반환해 주면 됩니다. 풀이 1칸이 있을 때 경우의 수 : 1 2칸이 있을 때 경우의 수 : 2 3칸이 있을 때 경우의 수 : 3 4칸이 있을 때 경우의 수 : 5 5칸이 있을 때 경우의 수 : 8 n칸이 있을 때 경우의 수 : “(n - 2) + (n - 1)” 칸이 있을 때 경우의 수의 합으로...
안정성과 생산성
Move Fast With Stable Infra 초기 스타트업의 최선책은 생산성이다. 빠르게 Product 를 시장에 출시하여 반응을 보고, 옳고 그름의 따라 앞으로 나아갈 방향을 결정 해야 한다. 수 많은 스타트업들을 보았고, 또 그 끝도 보았다. 내가 본 스타트업 시장은 가혹하다. “죽는가”, “생존하는가” 이 두 가지만이 존재한다. 생산성을 높여 빠르게 Product 를 출시하여 성과를 보지 못한다면 그 팀은 국한된 운영자금이 바닥이나면 문을 닫아야한다. 만약 운이 좋아 Product 가 시장에서 좋은 평가를 받아 기하급수적으로 유저가 유입되었을 때 안정된 인프라가 구축되어있지 않다면 이 또한 비극이다. 결국엔 안정성과 생산성 두 가지를 겸비하고 있어야 생존할 수 있다.
MySQL Data Types
본 문서는 Github 에서도 공개되었으니, 블로그 UI 보단 Github UI가 가독성이 좋다고 여겨지시는 분들은 여기를 참고해주세요. Data Types 프로그래머는 데이터 모델을 구성할 때, 자료형을 관과하여 설정하면 안된다. 자료형은 성능에 영향을 끼치기 때문입니다. ## Numeric Data Types DECIMAL은 주로 화폐 저장 용도로 사용합니다. (오차 미 발생) UNSIGNED 사용가능합니다. unsigned 선언 시 범위가 0부터 시작됩니다.(e.g. -128 ~ 127 to 0 ~ 127 ) Type Description TINYINT(n) 정수형 데이터 타입(1byte) -128 ~ +127 또는 0 ~ 255수 표현 가능 SMALLINT(n) 정수형 데이터 타입(2byte) -32768 ~ 32767 또는 0 ~ 65536수 표현 가능 MEDIUMINT(n) 정수형 데이터 타입(3byte) -8388608 ~ +8388607 또는 0 ~ 16777215수 표현 가능 INT(n) 정수형 데이터 타입(4byte) -2147483648 ~ +2147483647 또는 0 ~ 4294967295수 표현 가능 BIGINT(n) 정수형 데이터 타입(8byte) - 무제한 수 표현 가능 FLOAT(길이,소수) 부동 소수형 데이터 타입(4byte) -고정 소수점을 사용 형태 DECIMAL(길이,소수) 고정 소수형 데이터 타입고정(길이+1byte) -소수점을 사용 형태 DOUBLE(길이,소수) 부동 소수형 데이터 타입(8byte) -DOUBLE을 문자열로 저장
Webhacking.kr 50번 문제
50번 문제는 이전 문제보다 150스코어 높은 450스코어의 해당하는 문제이다. 문제를 보면 폼이 하나 보이고, 그 위에 큰 글자로 “SQL INJECTION” 이라 적혀 있다. 그렇다. 이 문제 또한 “SQL INJECTION” 문제인 것 이다. 폼은 “id”, “password” 란이 보이고 기본 값으로는 “guest” 로 기재되어있다. Get parameter 의 id 키 값을 mb_convert_encoding 함수를 통해 재 대입하는데, 이 때 euc-kr 인코딩에서 utf-8인코딩으로 변환하는 과정에서의 취약점이 존재합니다. ",$ck)) exit();if(eregi("");if($data[0]=="2") echo("level : 2");} if($data[0]=="3"){@solve();}  if(!$data){echo("Wrong");} } ?> php 에서 magic_quotes_gpc 설정하여 ‘, “, /, %00등의 값이 들어가게 되면 /와 함께 붙게 되어 injection을 방어합니다. 멀티바이트를 사용하는 언어셋 환경에서는 함수가 \ 앞에 %a1~%fe의 값이 들어오게 되면 %a1\이 한 개의 문자로 취급하여 인코딩해서 \를 치환해버린다. pw 를 md5로 인코딩 하는 부분을 주석 처리하여 id와 pw가 이어지게하여 인젝션을 시도한다. select lv from members where id='%a1'/*' and pw=md5('*/union select 3 #') 
Google cloud connecting to Linux Instances
Google cloud connecting to Linux Instances 본 문서에서는 SSH 를 통해 구글 클라우드 VM 인스턴스에 접속하는 방법을 서술하고있습니다. 구글 클라우드 공식 문서를 참고한 이후, 개인적으로 정리하고 작성한 문서입니다. SSH Key 등록 SSH 키가 존재하지 않는 경우, 먼저 SSH Key 를 생성해주세요. 명령어 옵션에 대한 설명은 아래와 같습니다. ssh-keygen -t rsa -C "[email protected]{your-email}" Key 가 이미 존재하는 경우, 위 명령어 질의는 건너뛰고, Public key 내용을 cat 명령어를 통해 출력 후 구글 클라우드 Metadata 탭으로 이동합니다. 탭 내 항목이 두개가 존재하는데, 여기서 Add ssh key 를 선택 후, 출력된 Public key 내용을 추가합니다. SSH 접속 아래 명령어를 통해서 접속합니다. ”[]” 안에 담긴 항목들의 설명은 아래와 같습니다. PATH_TO_PRIVATE_KEY SSH KEY 비공개키 주소를 기입합니다. (e.g. ~/.ssh/id_rsa) USERNAME 키 생성시 등록한 아이디 EXTERNAL_IP_ADDRESS 접속을 희망하는 인스턴스 외부 아이피 주소 ssh -i [PATH_TO_PRIVATE_KEY] [USERNAME]@[EXTERNAL_IP_ADDRESS]
Webhacking.kr 49번 문제
49번 문제는 300스코어의 문제이며, 이전의 문제 풀이 했을때 같은 쉬운 편에 속하는 문제와 비슷한 유형이다. 거의 데자뷰급.. 페이지를 보면, 머리말에 SQL INJECTION 이라 기재되어있다. 그렇다. 본 문제는 SQL Injection 문제이다. 페이지내 작은 입력 폼이 보이고, “level” 이라는 라벨 옆 한개의 인풋 필드가 존재하는데, 이 필드의 기본 값은 “1” 이다. 기본값으로 요청을 해보니, 입력 폼 하단에 “zzibong” 이라는 값이 추가되어 응답한다. 이 후, 다른 값으로 요청해 보았을 때 위의 문자열을 더 이상 응답해주지않고있다. ”   ”, “&&” 등의 연산자를 테스트겸 추가하여 요청해보니 추가된 연산자에 따라서 “zzibong”값이 응답되었다. 문제 내 소스를 보니, 힌트 페이지가 숨겨져있었고, 숨겨진 힌트 내용은 아래와 같다. if(time()<1258110000) exit();if($_GET[lv]){if(eregi("union",$_GET[lv])) exit();if(eregi("from",$_GET[lv])) exit();if(eregi("select",$_GET[lv])) exit();if(eregi("or",$_GET[lv])) exit();if(eregi("and",$_GET[lv])) exit();if(eregi("\(",$_GET[lv])) exit();if(eregi("\)",$_GET[lv])) exit();if(eregi("limit",$_GET[lv])) exit();if(eregi(",",$_GET[lv])) exit();if(eregi("/",$_GET[lv])) exit();if(eregi("by",$_GET[lv])) exit();if(eregi("desc",$_GET[lv])) exit();if(eregi("asc",$_GET[lv])) exit();if(eregi("cash",$_GET[lv])) exit();if(eregi(" ",$_GET[lv])) exit();if(eregi("%09",$_GET[lv])) exit();[email protected]_fetch_array(mysql_query("select id from members where lv=$_GET[lv]"));echo($q[0]);if($q[0]=="admin") @solve();} eregi 라는 method의 설명은 아래와 같다. Case insensitive regular expression match 대소문자 구별 없이, 첫 번째 인자 값에 해당하는 문자열을 두번째 인자값에 찾는다. 이 후 참이라면 exit method keyword 를 통해 프로세스를 종료한다. 따라서 아래 목록에 있는 문자열은 사용할 수 없다는 것 이다. union from select or and \( \) limit...
Introduction to Promises in Javascript
Introduction to Promises in Javascript 이 문서는 Promise 구문에 대한 지식이 없는 분들께 도움을 드리고자 제가 이해한 내용을 공유합니다. 현재의 자바스크립트 시장은 격동의 시기라고 할 수 있습니다. ECMAScript6 등 여러 새로운 표준 기술이 잇달아 나오고있습니다. 여기서 소개하고자하는 Promise 또한 이 표준 기술 중 하나입니다. 아래 참고 그림은 Promise 가 어떤 동작 방식을 취하고 있는지 잘 알려주고 있습니다. 자세한 내용은 목차에 기재된 “Promise 는 어떻게 사용해요?” 에서 다루겠습니다. 본 문서의 목차는 아래와 같이 구성 되어있습니다. Promise 란 무엇인가 Promise 를 사용하면 장점이 뭔가요? Promise 는 어떻게 사용해요? Promise의 상태(State)에 대해서 Promise의 API 알아봐요 ! Promise 란 무엇인가 자바스크립트는 모든 작업이 Async(비동기)로 이루어집니다. “Promise” 객체에 대하여, 모질라 개발 문서에는 아래와 같이 기재되어있습니다. Promise 객체는 비동기 계산을 위해 사용됩니다. Promise는 아직은 아니지만 나중에 완료될 것으로 기대되는 연산을 표현합니다. Promise는 비동기 처리 로직을 추상화 한 객체와 그것을 조작하는 방식을 말합니다. 개념은_ E 언어에서 처음 고안_됐으며 병렬 및 병행 프로그래밍을 위한 일종의 디자인입니다. 이 디자인을...
동물원 from BOJ
문제 어떤 동물원에 가로로 두칸 세로로 N칸인 아래와 같은 우리가 있다. 이 동물원에는 사자들이 살고 있는데 사자들을 우리에 가둘 때, 가로로도 세로로도 붙어 있게 배치할 수는 없다. 이 동물원 조련사는 사자들의 배치 문제 때문에 골머리를 앓고 있다. 동물원 조련사의 머리가 아프지 않도록 우리가 2*N 배열에 사자를 배치하는 경우의 수가 몇 가지인지를 알아내는 프로그램을 작성해 주도록 하자. 사자를 한 마리도 배치하지 않는 경우도 하나의 경우의 수로 친다고 가정한다. 입력 첫째 줄에 우리의 크기 N(1≤N≤100,000)이 주어진다. 출력 첫째 줄에 사자를 배치하는 경우의 수를 9901로 나눈 나머지를 출력하여라. _ _ 풀이 d1[i] = 2*i인 우리에서 i 번째 칸에 사자를 0마리 놓는 경우의 수 d2[i] = 2*i인 우리에서 i 번째 칸의 한 쪽에만 사자를 1마리 놓는 경우의 수 d1[i] = d1[i-1] + d2[i-1] * 2 d2[i] = d1[i-1] + d2[i-1] 1차원으로 더 압축 했을 시 d1[i] = d1[i-1] + d2[i-1] * 2 d1[i] = (d1[i-2] + d2[i-2] * 2) + (d1[i-2] + d2[i-2]) *...
Webhacking.kr 40번 문제
Challenge 40 500 스코어 문제이며, 다른 문제에 비하여 상대적으로 높은 점수의 속한다. “no”,”id”,”pw” 세개의 필드가 있고, 하단에는 로그인 버튼이 있는 폼이 존재한다. 기본적으로 필드에는 값들이 대입되어있다. 대입되어있는 값의 정보는 아래와 같다. no : 1 id : guest pw : guest 테스트를 위해 no 파라미터에 인젝션 쿼리를 대입하여 질의해 보았다. 응답 값은 “access dinied” 이다. 이번엔 조건을 거짓으로 만들어보니 “Failure” 를 응답한다. 응답 이후에, meta 태크를 통해서 2초 후 페이지를 이전 페이지로 리다이렉트한다. -1||if(no=2,1,0) if 문을 이용해서 no 파라미터가 2 이면 1을 반환하도록 해보았다. 이후 페이지가 리다이렉트 되는데, 리다이렉트 된 페이지에는 admin password 라는 입력 폼이 보인다. 음.. password 를 알아낼 수 있는 힌트를 주지 않는다. 따라서 MySQL LIKE 구문을 사용하여 “pw like %” 와 같은 쿼리를 질의하여 패스워드를 알아낼거다. 우선 블라인드 인젝션을 위해 pw 필드의 길이를 알아야하기 파이썬 스크립트를 작성했다. 덕분에 패스워드 길이가 10이라는 것을 알아낼 수 있었다. 이후에 파이썬 스크립트를 다시 작성해, 패스워드를 알아내서 본 문제를 Solved 했다. 스크립트는...