Sequential Search vs Binary Search
두 알고리즘의 시간 복잡도 기준으로 비교 시, 순차 탐색 알고리즘은 $O(n)$이고 이진 탐색 알고리즘은 $O(long)$ 이므로 당연히 퍼포먼스적 우위는 후자일 것이라 생각한다. 하지만 이는 언제 까지나 오름차순으로 데이터가 정렬되어 있다고 가정 되어야 한다. 일반적인 정렬 알고리즘은 $O(nlogn)$의 시간 복잡도를 가지기에 무조건적으로 이진탐색이 좋다고 단정지으면 안된다. 결론적으로 데이터가 정렬 되어있지 않다면 이진탐색을 권장 안하는게 좋다. 이진 탐색은 결론적으로 정렬된 데이터의 집합을 이분화 하면서 탐색하기 때문이다.
라라벨에서 Constants 제대로 사용하기
Laravel 에는 별도의 Constants 관련 디렉토리와 명령어가 존재하지 않는다. 그렇다면 Constants는 어디에 위치해있는 것이 올바른 것 일까 ? 사람들은 어떤 방법으로 이 문제를 해결 했을까 먼저 살펴보았다. 검색 한번으로 많은 사람들이 나와 같은 궁금증을 품고있다는 것을 알았다. How to use my constants in Laravel How i can define my own constants? What is the best practice for adding constants in laravel? (Long List) 하지만 답변은 내가 전적으로 동의할 수 없는 내용이었다. 모든 답변들은 config 파일에 constants 관련 파일을 생성하라고하는데, 이는 진짜 constants 가 아니다. constants의 사전적 의미는 아래와 같다. 프로그램에서는 실행중에 바뀌지 않는 데이터를 말한다. 기억 장치 내부에 축적되어 있는 불변의 데이터로 보통 프로그램 단계에서 지정된 것이 프로그램을 읽어들일 때 루틴의 일부로서 컴퓨터 기억 장치에 읽어들여진다. laravel 에서 설정파일 내 값은 아래와 같이 쉽게 변경할 수 있다. $value = config('app.timezone'); config(['app.timezone' => 'America/Chicago']); 그러니 위 방법을 채택하여 사용 중이라면, 변경하길 권장한다. 본인이 설정한 방법을 기준으로 서술하겠다. `app` 하위 디렉토리로 `Constants` 디렉토리를 생성 한다....
Composer 속도 향상
Optimizing composer Composer 는 상황에 따라 느리다는 평을 많이 받고있다. 더 이상 속도 때문에 괴로워하지 말고, 아래 방법을 통해서 속도를 향상 해보길 바란다. 첫 번째, Composer 자가 진단 composer 에는 diagnose 라는 명령어가 존재한다. diagnose 의 설명은 아래와 같다. 오작동 발생 시, 해당 명령어를 통해 일반적인 문제에 대한 자동 검사를 진행한다. 검사 이 후, 결과에 따라 개선이 필요한 부분들을 확인하고 개선할 수 있다. If you think you found a bug, or something is behaving strangely, you might want to run the diagnose command to perform automated checks for many common problems. 두 번째, 병렬처리 다운로드를 도와주는 prestissimo 우리와 같이 속도에 고통에 시달리는 일본의 개발자가 prestissimo 라는 Composer 플러그인을 제작했다. 해당 플러그인을 통해 의존성 라이브러리 설치시 병령 처리를 지원하여 속도를 대폭 개선해준다. 플러그인 설치는 아래 명령어를 통해 좀 더 쉽게 할 수 있다. composer global require hirak/prestissimo 아래와 같이 Benchmark 시, 288s -> 26s 결과라는 만족스러운 결과를 내주었다. composer create-project laravel/laravel...
반갑다. 2018년
지나온 시간을 돌이켜보면 우여곡절 많았고, 덕분에 많은 경험과 학습을 통해 비교적 넓은 spectrum 을 보유할 수 있게 되었다 생각한다. 다만, 항상 그 깊이에 대해 의구심이 남는다. 열정으로 사놓아 다 읽지 못한 책들, 임시 대기중인 기술 관련 작성글들도 여럿있다. 결국엔 나 자신의 앞서가는 마음을 몸은 못 따라 갔나보다. 메타인지 부족을 많이 체감한다. 새로 맞이한 18년에는 프로그래머로써 좀 더 성장할 수 있는 계기가 되었으면 좋겠다. 앞으로 조금 집중해서 풀어가고자 하는건 아래와 같다. 알고리즘 공부 디자인 패턴 공부 (GOF의 디자인 패턴 책좀 끝내자 !) ES6 공부 ReactJS 연재 추상적인 내 계획을 좀 더 구체화하여, 구글 캘린더에 일정을 등록했다. 위 목차와 관련된 책들을 모두 구비되어있어 따로 준비할 것 들도 없을 것 같다. 과거와 현재 그리고 미래 습득한 지식들이 어느 시점에 가면 불필요할 것 이다. 기술이란 항상 바뀌는 것이며, 그 기술의 탄생배경과 정말 해결하고자하는 철학을 아는 것이 더 중요하다. 좀 더 문제의 본질을 알고있다면 각기 변하는 기술의 파도에 서핑하며 즐길 수 있을 것이라 생각한다. 올...
JWT(JSON Web Token)에 대해 알아보자
단어가 모든걸 나타내 듯, JWT는 JSON을 이용한 Web Token 이며, 웹표준(RFC 7519)이다. Claim Base Token 이며, 두 개체에서 JSON 객체를 이용해 자가수용적(Self-contained)이며 가볍고 안전하다. HTTP Authorization Hearder 또는 URI 쿼리 파라미터 등에 공백 사용이 불가능한 곳에서 사용하기 적합하다. 위에서 말한 Claim 이란 사용자에 대한 프로퍼티나 속성을 뜻 한다. 즉, 토큰 자체가 정보를 가지고있는 방식이다. JWT의 경우 앞서 말했 듯 _Claim 을 JSON을 이용_해 다룬다. JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. This information can be verified and trusted because it is digitally signed. JWTs can be signed using a secret (with the HMAC algorithm) or a public/private key pair using RSA Claim Base 와 다르게 OAuth 의 경우 발급되는 access_token 통상적으로 일반 랜덤 스트링이며, 아무런 의미를 가지고 있지 않다. 요청된 access_token 값을 통해서 서버는 이용자의 권한을 확인 후 허용해주는 구조를...
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 #')