참조 (reference)
Get down to business 참조는 아시는 분은 아시겠지만 _메모리의 주소값을 같이 사용_하는 개념입니다. C언어를 공부하셨다면, 아마 쉽게 아시는 내용이실 겁니다. 확실히 알고 넘어가야할 것 은 _“참조” 와 “대입”_은 다릅니다. 대입은 $a의 값을 $b에 대입하면서 내용을 완전히 복사하여 다른 메모리 위치에 저장하는 것 입니다. 만약 $a의 값이 변경되어도 $b의 값에는 전혀 영향을 미치지 않고 완전히 독립된 두 개의 변수를 만드는 반면, 참조는 같은 저장소(메모리 위치)를 가리키기 때문에 동일한 내용을 다루게 됩니다. 단점은 참조 일때는 변수가 값을 가지고 있는게 아니라, 값에 대한 메모리 주소를 소유하고 있는 것이기 때문에 그 주소를 찾으러 가야합니다. 비교적 속도가 느린편입니다. 아래는 PHP 언어 기준으로 벤치마킹한 내용입니다. In a test with 100 000 iterations of calling a function with a string of 20 kB, the results are Function that just reads / uses the parameter pass by value:      0.12065005 secondspass by reference:  1.52171397 seconds ** ** Function to write / change the parameter pass by value:...
Fail2Ban 통하여 브루트 포스 예방
Fail2Ban 은 로그기반의 무료 소프트웨어이며, 브루트 포스 (무차별 로그인 공격)에 대한 보안 역할을 합니다. 지정 시간 내 지정 횟수 만큼 실패할 경우 별도의 차단 시스템이 작동하며, 이외 개별적으로 선택한 알림(e.g. 메일, 슬랙) 메커니즘을 통하여 관리자에게 알림이 갑니다. Fail2Ban is an intrusion prevention software framework that protects computer servers from brute-force attacks 위에 말했 듯 로그 기반의 시스템 입니다. 따라서 로그가 생성되는 시점을 기준으로 계산됩니다. (iptables을 이용해 서버접근을 차단한다.) 이 때문에 발생하는 fail2ban maxretry별 최대 로그인 시도가능 횟수는 아래와 같습니다. 1 => 1번 2 => 7번 3 => 13번 4 => 19번 5 => 25번 6 =>31번 n => 6*(n-1) + 1 번 SSH 경우 로그인이 실패하면 재시도 5회까지 허용합니다. 재시도는 카운트 되지 않습니다. 뭐, 당연한 얘기겠지만요. fail2ban 을 설치하면 전연적 패킷 컨트롤이 가능해집니다. 기본 설정 값으로 진행한다면 SSH 연결에 대해서 최근 10분간 6회이상 비밀번호가 틀릴 시, 10분동안 ssh 접속차단 됩니다. fail2ban은 데몬이 재 시작 시 이전 차단 목록을 초기화되기 때문에...
GoF의 디자인 패턴
GoF의 디자인 패턴 최근들어 다시금 디자인 패턴에 관심이 많아 졌다. 이 관심 덕분에 GoF의 디자인 패턴을 알게되었고 구매까지 이르렀다. 본인은 조금 더 유연한, 조금 더 확장성있고 효율적인 Architecture 를 구현하고 싶다. 뭐 이것은 모든 프로그래머의 꿈 아니겠는가. 본 책에서는 본인이 알고있던 내용과는 조금은 다른 (e.g. 싱글톤 패턴) 내용을 담고있어 혼란스러웠는데 많이 찾고 생각이 정리되어 되려 내 지식이 된 것 같아. 기쁘다. 열심히 읽어서 친구들에게 공유해주고싶다. 생성 패턴(Creation Patterns) Abstract Factory Builder Factory Method Prototype Singleton 구조 패턴(Structural Patterns) Adapter Bridge Composite Decorator Facade Flyweight Proxy 행동 패턴(Behavioral Patterns) Chain of Responsibility Command Interpreter Iterator Mediator Memento Observer State Strategy Template method Visitor
The Great Gatsby. Novel by F. Scott Fitzgerald
얼마전 위대한 개츠비 책을 구매했습니다. 책을 보기 앞서, 영화를 통해서 내용을 먼저 접했는데 너무 매료되어 책 까지 구매했습니다. 시대의 배경은 1920년 재즈시대입니다. 변질된 아메리칸 드림과 당대 사람들의 모습이 섬세하게 담겨있어 읽는 동안 그려지는 그림의 나래가 무척이나 행복했습니다. 휴대성이 좋아 덕분에 출퇴근하는 지하철에서 심심치 않게 갔습니다. 아래 구문은 책에 나온 대목입니다. 이 대목이 이 책의 모든 내용을 함축하고있는 것 같습니다. 그럼 황금 모자를 쓰려무나. 그래서 그녀의 마음을 움직일 수만 있다면. 높이 뛰어오를 수 있거들랑 그녀를 위해 높이 뛰어오르려무나. 그녀가 이렇게 외칠 때 까지 “상하는 이여, 황금 모자 쓰고 높이 뛰어 오르는 사랑하는 이여. 당신을 차지해야겠어요.”
Scalar Type Hints
PHP 7이 릴리즈되면서 Scalar types 추가되었습니다. (아래 항목 참고) int float bool string interfaces array callable type hinting은 변수의 타입을 명시적으로 지정하는 것을 말합니다. 타입을 명시하게 되면 프로세스가 실행하는 시점에 명시된 타입의 변수가 아닌 다른 타입의 경우 에러를 반환하고 프로세스를 중단 시킵니다. 명시된 type으로써 좀 더 정확한 정보를 얻을 수 있고 self documenting php 프로그램을 만드는데 한걸을 다가설 수 있습니다. php7 이전 type hinting은 아래와 같이 메소드의 매겨변수 안에 class 타입과 array 타입 형태로만 지원하고 있었습니다. function enroll(Student $student, array $classes) {    foreach ($classes as $class) {        echo "Enrolling " . $student->name . " in " . $class;    }}/* Catchable fatal error: Argument 1 passed to enroll() must be an instance of Student, string given */enroll("name",array("class 1", "class 2"));/* Catchable fatal error: Argument 2 passed to enroll() must be of the type array, string given */enroll($student,"class");enroll($student, array("class 1", "class 2")); 스카랄 변수의 type hinting은 strict...
Adaptive Hash Index
Overview RDBMS에서 대부분의 경우 일반적으로 사용되는 자료 구조는 B-Tree 입니다. Primary Key 순으로 정렬하여 관리하고 Secondrary Key는 인덱스키 + PK를 조합하여 정렬하고있습니다. 데이터의 사이즈가 커져도 특정 데이터 접근에 소요되는 비용이 크게 증가되지 않기 때문입니다. 또 노드의 삽입, 삭제 후 에도 균형 트리 유지로 균등한 응답속도 보장하고 효율적인 알고리즘 제공합니다. PK로 접근 시 데이터 접근에 소요되는 비용은 O(logN)이고, 두번째 트리에 접근하는 Secondrary Key에 소요되는 비용은 2 * O(logN)입니다. 단점도 존재하는데, 삽입과 삭제시 트리의 균형을 유지하기 위해 복잡한 연산(재분배,합병)이 필요 (½일 때 분열이 일어남, 2/3일 때 분열이 되는 B*TREE 활용)합니다. 또한 Mutex Lock이 과도하게 생성되면 적은 데이터 셋에도 자원 사용 효율이 감소하게 됩니다. _자주 사용되는 데이터 탐색에도 불구하고 매번 트리의 경로를 쫓아_가야 한다는 애로사항이 있습니다. 이와 같은 애로 사항 때문에 퍼포먼스를 최대로 발휘하지 못 하는 경우가 많습니다. 이에 대한 해결책으로InnoDB에는 Adaptive Hash Index 를 지원합니다. InnoDB Adaptive Hash Index는 B-Tree의 한계를 보완할 수 있는 좋은 기능입니다. Adaptive Hash Index ? The adaptive...
Problems with GET_LOCK on MySQL?
Overview 이번에 서비스를 운영하면서 MySQL 지연 현상을 마주했다. 모든 자원과 지표를 보고 판단했을 때, 지연현상이 발생하는 것이 의아했다. 트래픽의 발생은 지연 시점 이전보다는 확실히 증가했지만 그렇다해서 현재 자원에서 이 트래픽을 처리 못하는 것은 납득 할 수 없었다. 그렇게 끝없는 삽질 끝에 락(Lock)이 매우 지연되어 다른 큐들이 진행되지않아 발생한 문제였다. 그렇다면 락이 발생한 이유는 무엇이고, 언락되기 까지 무기한 지연되어하는가 ? Cause 현재 서비스를 개발하면서 AWS 인프라를 적극적으로 활용하고있다. RDS 에서는 transaction isolation level이 engine default 라, innodb를 사용하고있는 현재 시점에서는 transaction isolation level은 repeatable-read 다. innodb 기본 transaction isolation level 이 repeatable-read 이다. REPEATABLE-READ에서는 현재 Select 버전을 보장하기 위해 Snapshot을 이용하는데 이 경우 해당 데이터에 관해서 암묵적으로 Lock과 비슷한 효과가 나타난다. _ _ 즉, Select 작업이 종료될 때까지 해당 데이터 변경 작업이 불가하다. 따라서 인덱싱없는 데이터의 FULL-SCAN 또는 무거운 쿼리의 질의가 이루어지면 지연현상이 발생할 가능성이 높다. 결국 이 부분 까지 고려하지 못 해서 지연현상이 발생했다. 운영에 있어서 exception case 가 너무나...
MySQL Locked 확인
show open tables; MySQL 전체 테이블 잠금여부 show open tables from ‘db명’ 해당 DB의 테이블 잠금 여부 show open tables from ‘db명’ like ‘테이블명’ 해당 DB의 특정 테이블의 잠금 정보 What is show open tables command ? SHOW OPEN TABLES lists the non-TEMPORARY tables that are currently open in the table cache 락 상태의 테이블 확인 - SHOW OPEN TABLES WHERE in_use>0; 특정 상태의 테이블 확인 - SHOW OPEN TABLES WHERE in_use>0 AND Table=’your_table_name’; 참고 MySQL 5.7 Reference Manual SHOW OPEN TABLES Syntax
웹 개발자 진로 로드맵 ( Roadmap to becoming a web developer in 2017 )
2017년 업데이트된 개발자 진로 로드맵 앞으로 가야할 길들이 좀 더 명확하게 보이는 것 같아 유용해서 남겨둔다. Below you find a set of charts demonstrating the paths that you can take and the technologies that you would want to adopt in order to become a frontend, backend or a devops. I made these charts for an old professor of mine who wanted something to share with his college students to give them a perspective. If you think that these can be improved in anyway, please do suggest. ** ** Front-end Roadmap Back-end Roadmap DevOps Roadmap 출처 Roadmap to becoming a web developer in 2017
고려대학교 신입생 프로그래밍 경시대회 문제
문제 알고리즘 문제해결의 세계에 오신 것을 환영한다! 여러분들은 앞으로 열심히 공부하여 세계 최대의 대학생 프로그래밍 대회인 ACM-ICPC에 참여하게 될 것이다. 따라서 ACM-ICPC의 대회 방식을 잘 익혀두는 것이 좋을 것이다. ACM-ICPC는 세계에서 가장 큰 프로그래밍 대회이다. 3인이 1팀을 이루어 알고리즘 문제해결 능력을 겨루며 컴퓨터는 1대만 주어진다. 각 지역에서 Regional 대회를 통해 대표를 선발한 후 선발된 팀들은 최종적으로 World Final에서 실력을 겨루게 된다. 대회에서는 대략 10개 내외로 문제가 주어지며 5시간동안 주어진 문제들을 최대한 많이 풀어서 통과해야 한다. 만약 틀린 답안을 제출했을 경우 다음과 같은 피드백을 준다. run-time error time-limit exceeded wrong answer 다음은 등수 산정 방식을 설명한 것이다. 각 팀의 등수는 문제를 많이 푼 순으로 산정된다. 만약 푼 문제 수가 같을 경우 ‘총 시간’이 작은 순으로 산정된다. ‘총 시간’은 각 문제를 풀어서 통과했을 때의 시간 값을 더한 것이다. 각 문제를 풀어서 통과하면 대회 시작으로부터 통과할 때까지 걸린 분 수와 그 문제를 통과하기 이전의 틀린 답을 제출한 횟수에 20을 곱한 패널티를 더한다. 앙...
고려대학교 신입생 프로그래밍 경시대회 <뜨거운 붕어빵> 문제
문제 고려대학교에 입학한 새내기 호돌이는 안암역을 지나다가 한 붕어빵 장수를 만났어요. “안녕, 안녕, 안녕하십니까, 아저씨! 붕어빵 두 개 주세요.” “안녕을 세 번 외쳤으니 붕어빵 세 개!” 붕어빵 두 개의 값을 내고 세 개를 받은 호돌이는 기분이 좋았어요. 호돌이가 붕어빵 하나를 꺼내어 한 입 물었는데…. 너무 뜨거워서 그만 붕어빵을 떨어뜨리고 말았어요ㅠㅠ 붕어빵은 자유 낙하운동을 하면서 땅에 떨어졌는데 신기하게도 좌우가 뒤집힌 모양으로 착지했답니다. 호돌이가 붕어빵을 한 입 물기 전의 모양이 입력으로 주어지면, 땅에 떨어졌을 때에는 어떤 모양일지 출력하세요. ** ** 입력 첫째 줄에는 두 개의 정수 N과 M(0≤N,M≤10)이 주어집니다. 둘째 줄부터 N개의 줄에 걸쳐 붕어빵의 모양이 주어집니다. 각 행에는 공백을 나타내는 ‘0‘ 또는 붕어빵을 나타내는 ‘1’이 총 M개 주어집니다. 출력 입력으로 주어진 붕어빵이 좌우로 뒤집힌 모양을 출력하세요. 예제 입력 5 700100000111010111111101110100010000 예제 출력 00001000101110111111101011100000100 힌트 입력으로 주어지는 각 행을 반전시켜서 출력하면 됩니다. 입력의 1행 1열은 출력의 1행 M열로, 입력의 1행 2열은 출력의 1행 M-1열로 … 입력의 1행 M열은 출력의 1행 1열로 …...
Webhacking.kr 35번 문제
35번 문제는 350 스코어의 문제입니다. 문제의 힌트 코드는 아래와 같습니다. 코드를 읽어보면 첫번째로 get 메소드의 phone 파라미터가 참일 경우 challenge35_list 테이블에 레코드를 생성한다. 이후 admin_ck 라는 변수에 challenge35_list 테이블에 조건에 따른 레코드를 대입한다. 조건은 id는 admin 이어야하고, ip는 본인의 아이피여야합니다. 대입된 변수의 ip 가 본인의 아이피와 동일하다면 문제를 해결 할 수 있습니다. 몇번의 요청 중, webhacking.kr 이 php magic quotes 옵션이 켜져있어 quote 를 사용할 수 없음을 알 았습니다. 만약 옵션이 꺼져있었다면 핵스값으로 문자열을 표현하거나 MySQL의 char함수를 통하여 문자를 만들고, concat 함수를 통해 해당 문자를 연결해야합니다. 아래는 “php magic quotes” 에 대한 설명입니다. Magic Quotes is a process that automagically escapes incoming data to the PHP script. It’s preferred to code with magic quotes off and to instead escape the data at runtime, as needed. phone:3063),(‘admin’,’1.1.1.1’, 3072 하지만 코드를 보면 알 듯이 전자는 이미 필터링이 되어있으니 후자로 진행을해야합니다. phone 파라미터의 입력된 값은 아래와 같다. (아스키 코드로 치환된 admin,아이피) e.g. “1),(concat(char(97,100,109,105,110)),concat(char(49,46,50,53,53,46,50,52...
Webhacking.kr 34번 문제
34번 문제의 스코어는 400입니다. 스코어의 비해 문제의 난이도는 쉬운편에 속 합니다. 문제 페이지에 들어가면 “Wrong” 이라는 alert 이 발생한다. 중점으로 아래의 코드만 보면 된다. if (document.URL.indexOf("0lDz0mBi2") != -1) location.href = "Passw0RRdd.pww"; else alert("Wrong"); document.URL.indexOf("0lDz0mBi2") != -1 이 조건이 참이라면 “Passw0RRdd.pww” 로 리다이렉트하게되고, 거짓일시 “Wrong” alert을 띄어준다. 궁긍적으로 Passw0RRdd.pww 경로로 이동하면, 문제의 패스워드가 나오고 해당 패스워드를 auth 항목 기입하여 문제를 클리어할 수 있다.
휴봇 스크립트 테스트 (TESTING HUBOT SCRIPTS)
개요 일전에 슬랙에서 휴봇 사용하기라는 게시물을 포스팅한적있습니다. 아무래도 휴봇의 사용빈도가 높아지면서 사내에서 필요한 기능들이 터져나오기 시작했습니다.(기쁨) 날씨 요약본을 간단하게 알려주는 용도로 개발되었습니다. (맨 아래 사진도 몇 장 등본했습니다.) 설치 hubot-test-helper를 먼저 설치합니다. npm install hubot-test-helper --save-dev CoffeeScript 를 위해 필요 의존성 도구를 설치합니다. npm install mocha --save-devnpm install co --save-devnpm install chai --save-devnpm install coffee-script --save-dev 이 후, 테스트를 원하는 스크립트를 아래와 같은 형태로 실행하면 됩니다. 아래는 정상적으로 테스트가 성공한 결과입니다. 아래의 명령어를 통해, 테스트를 진행 할 수 있습니다. mocha –compilers “coffee:coffee-script/register” “{테스트할 대상 경로}” mocha --compilers "coffee:coffee-script/register" tests/test_hi.coffee  hello-world    user says hi to hubot      ✓ should reply to user  1 passing (152ms) 참고 TESTING HUBOT SCRIPTS
Webhacking.kr 33번 문제
33번 문제는 정확히 “스무고개’ 문제이다. 스테이지 별로 좀 다른 것 같지만 아무래도 상위 스테이지로 갈 수록 조금의 난이도가 추가되는 것은 사실인 것 같다. 정확히 10개의 스테이지(?)가 존재한다. 모든 항목들을 정리하기는 시간 상 다소 무리이니 간단하게 조건을 충족시키는 방법에대해 얘기하고자한다. ( $_GET[get]==”hehe” ) get 메소드의 get 파라미터의 hehe를 대입해서 요청하면 된다. ( $_POST[post]==”hehe” && $_POST[post2]==”hehe2” ) 문제 내에서 간단하게 Html 폼을 작성해서 해당 파라미터에 조건이 충족되는 값을 기입 후 요청하면 된다. ( $_GET[myip]==$_SERVER[REMOTE_ADDR] ) myip 라는 파라미터의 본인 아이피를 대입해서 요청하면 된다. ( $_GET[password]==md5(time()) ) 이 항목에서 hint에 현재 타임스탬프가 보여지고있다. 약 10 초 후의 타임 스탬프를 MD5로 암호화후에 요청하면 클리어된다. ( $_GET[imget] && $_POST[impost] && $_COOKIE[imcookie] ) imget, impost 에 임의에 값을 입력하고 imcookie 를 생성 후 요청하면 클리어 됩니다. ( $_COOKIE[test]==md5(“$_SERVER[REMOTE_ADDR]”) && $_POST[kk]==md5(“$_SERVER[HTTP_USER_AGENT]”) ) test 쿠키에 자신의 ip를 md5 로 암호화한 값을 대입하고 post 메소드에 kk 파라미터의 hint 항목에 나온 User Agent 값을 md5로 암호화 후 요청하면 클리어된다. (...