고려대학교 신입생 프로그래밍 경시대회 문제
NN 시간 제한 : 1초 메모리 제한 : 32 MB 문제 문제는 매우 간단하다. N을 N번 출력하는 프로그램을 작성하여라. 다만, _답이 길어지는 경우 답의 앞 M자리만 출력_한다. 입력 첫 번째 줄에는 N, M이 주어진다. (1 ≤ N, M ≤ 2016) 출력 N을 N번 출력한다. 만약 답이 길어지면 답의 앞 M자리를 출력한다. ** ** ** ** 답 정소를 문자열로 표현해서 생각하면 쉽다. Index 를 길이로 나눈 나머지 값에 해당하는 문자를 출력한다. #include#includechar str[30];int len, n, m;int main() {    int i;    scanf("%s%d", str, &m);    len = strlen(str);    for ( i = 0; i n*len ) {        m = n*len;    }    for ( i = 0; i < m; i++ ) {        putchar(str[i%len]);    }    return 0;}
자바스크립트 가인수(arguments)처리
자바스크립트는 arguments를 통해서 가인수를 받아온다. 오버라이딩 처럼 사용가능함을 의미한다. function sum(){    /* 오버 라이딩 */    var s=0;    for(var i=0; i<arguments.length; i++){        s+=arguments[i];    }    alert(s);}/* 실인수 */sum(1,2,3,4,5,6);
Lets' Encrypt로 무료로 HTTPS
개요 HTTPS 는 더 이상 선택이 아닌 필수입니다. Lets’ Encrypt 는 SSL을 무료로 제공해 HTTPS 의 보급율을 높이기 위해 만들어졌습니다 Let’s Encrypt 는 점유율 0.1% 미만의 인증기관입니다. 점유율이 매우 낮지만 절차 방법 또한 간단하고 최상위 발급 기관 중에 하나입니다. 대표적으로 무료 SSL을 지원하는 기관은 아래와 같습니다. Startssl Wosign Let’s Encrypt 위 인증기관마다 각자의 장단점의 내용 간략하게 적어봅니다. StartSSL 인증서 기간은 1년이다. (1년 마다 재발급 가능하다.) 분실시, 재 발급은 유료이다. Wosign 인증서 기간을 1~3년까지 지정할 수 있다. 꽤 많은 브라우저에서 해당 인증서를 신뢰할 수 없다. Let’s Encrypt’s 인증서 기간은 90일이며, 설치가 매운 간단하다. 이번에 자체 로그 시스템을 개발하게되어 아파치 웹 서버로 구성하여 개발하였다. 테스트 환경은 아래와 같습니다. 본 문서는 자동 갱신의 대해서는 따로 기재하지 않았습니다. 참고 문서 내용 중.. Let’s Encrypt’s certificates are only valid for ninety days. This is to encourage users to automate their certificate renewal process. We’ll need to set up a regularly run command to check for...
고려대학교 신입생 프로그래밍 경시대회 <파일 옮기기> 문제
파일 옮기기 ** ** ** ** 문제 두 개의 바구니에 사과와 오렌지가 있다. 첫 번째 바구니에는 사과 A개와 오렌지 B개가 있으며 두 번째 바구니에는 사과 C개와 오렌지 D개가 있다. 당신은 한 바구니에 있는 과일 하나를 집어서 다른 바구니로 옮길 수 있다. 이런 식으로 과일을 옮길 때, 한 바구니에는 사과만 있게 하고 다른 쪽에는 오렌지만 있게 하려고 한다. 앞서 말한 조건을 만족하도록 과일을 옮길 때, “과일을 옮기는 최소 횟수”를 구하는 프로그램을 작성하여라. 입력 첫 번째 줄에는 첫 번째 바구니에 있는 사과와 오렌지의 수 A, B가 주어진다. (0 ≤ A, B ≤ 1,000) 두 번째 줄에는 두 번째 바구니에 있는 사과와 오렌지의 수 C, D가 주어진다. (0 ≤ C, D ≤ 1,000) 출력 사과와 오렌지를 옮기는 최소 횟수를 출력한다. ** ** 답 File 이 아니라 Pile 이다. min(A+D+ , B+C) - (Orange, Apple), (Apple, Orange) #include#includeint a, b, c, d; # 첫째 바구니 (사과, 오렌지,) 둘째 바구니 (사과, 오렌지)int main() {   ...
Setting CORS on Apache with correct response headers
아래 게시물의 연장선상이다. http://blog.hax0r.info/750 CORS 를 설정안하고있었다니 ! SSL 설정하는라 제일 기본적인걸 건너뛰었다. 그래서 바로 추가함. Header set Access-Control-Allow-Origin "Origin 호스트"Header set Access-Control-Allow-Methods "허용 메소드 (e.g GET, POST, PUT 등등)"
Apache Enabling .htaccess file to rewrite path
중학교 2학년 때 잠시 게임 서버 때문에 Apache 웹 서버를 사용했던 적 있는데, 시간이 지나니 자연스럽게 다른 플랫폼을 이용하다 이번에 로그 시스템 개발을 진행하게 되면서 사용하게되었다. 설치가 간단해서 참 좋다. 자체적인 로그시스템이라하면, 따로 로그 인스턴스의 Access log 기반으로 매일 주기적으로 데이터를 정리해 파일을 압축해 클라우드에 올리는 흐름으로 정리 구성 되어있다. 궁극적으로 우리 시트템의 이용자를 Tracking 하기 위해 구성되어있다. 그런데 여기서 애로 사항은 CORS 문제 때문에 옵션을 추가해줘야하는데, .htaccess 에 해당 헤더 값 을 추가해도 동작하지 않아 확인해보니 이전 설정과 조금 변동사항이있었다. 로그 시스템 코드는 Github 에 오픈 소스로 등록해두었다. https://github.com/Logispot/analyze-traffic-for-truckup 본 문제는 검색하니 금방 나와서 블로그에 짧게 나마 적어본다. New apache version has change in some way. If your apache version is 2.4 then you have to go to /etc/apache2/. There will be a file named apache2.conf. You have to edit that one(you should have root permission). Change directory text like this 2.* 버전대 이용자라면 “/etc/apache2/apache2.conf” 해당 경로의 설정파일의 옵션값을...
MySQL Resolving 으로 인한 지연현상
갑작스러운 MySQL 속도 지연현상이 발생했다. 제일 먼저, Slow Query 를 확인했고 이상 없음으로 판정했다. 이 후, 이전 이와 같은 예외 케이스를 경험한 적 이 있어서, 혹시 해서하니 역시 Resloving 문제였다. MySql에서 접속 시, IP에 대한 Resloving(역질의)가 이루어진다. 하지만 대 부분의 IP는 등록되어 있지 않으며 DNS가 느리다면 이 부분은 더욱 심각한 속도 문제로 발생한다. 이 를 해결 할 수 있는 방법은 _역질의를 순서를 건너뛰는 방법_이다. skip-name-resolve 설정을 하면된다. 위 옵션에 대해 부가 설명을 하자면, 클라이언트에서 서버로 접속시 DNS Lookup 과정을 생략해 줍니다. localhost 로 접속하는 경우는 문제가 없지만 IP 로 접속하는 환경에서는 DNS 서버가 느리거나 아님 장애 발생시에 해당 옵션을 설정해 주므로써 DB 접속시에 문제점을 해결할 수 있습니다. skip-name-resolve은 설정 파일에서 직접적으로 할 수 있고, 또는 아래 명령어를 통하여 설정할 수 있다. mysql> show global variables like 'skip_name_resolve';show global variables like '%timeout%';show variables like '%timeout';show processlist; (MySQL 접속 시, 간단 흐름도) 참고 문서 Server Command Options skip-name-resolve to speed up MySQL and...
Python 3 웹 서버 테스트
디렉토리 리스트를 간단히 보여주는 웹 서버 기능 python3 -m http.server 8080Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) 요청하면, 아래와 같은 응답, 2보다 좋은 것 같음. 127.0.0.1 - - [28/Apr/2017 17:10:46] "GET / HTTP/1.1" 200 -
슬랙에서 휴봇 사용하기 (Slack Developer Kit for Hubot)
What is hubot Hubot 은 본래 깃헙 사내용으로 제작된 챗봇이지만, 많은 발전을 거듭하며 현재 오픈소스로 공개되어 있다. Node 기반이며 슬랙에 친화되어 있으며, 왠만한 기능들을 모두 갖춘 챗봇 프레임워크 역할로써 빠른 개발의 도움을 준다. 본인의 경우 전 회사와 현재 회사에서 모두 Hubot 을 채택하여 사내용 챗봇을 개발했다. 이를테면 매일 오전 오늘 전국의 날씨를 알려준다거나, 태스크 통계를 내준다거나, elasticache redis 관련 명령어를 질의한다거나등 필요에 따른 기능들을 추가하여 재밌게 가지고 놀았다. 이러한 짧은 경험에서 내가 느낀 휴봇의 가장 큰 장점은 간단한 스크립트(CoffeeScript, JavaScript) 작성을 통해 강력한 기능을 추가할 수 있다는 점 이다. 스크립트는 coffeescript 또는 javascript로 작성할 수 있으며, 특정 단어, 문장, 행동등의 따라 이후의 프로세스를 정의 할 수 있다. 스크립트를 직접 작성할 수 도 있겠지만, 휴봇에서는 여러 스크립트들을 제공하고 있어 구현하고자하는 명령어에 따라 손쉽게 스크립트를 추가하여 구현할 수 있다. 아래는 스크립트에 대한 설명을 돕고자 몇가지 예를 들 수 있는 작은 항목들을 기재해 두었다. 더 자사한 내용은 공식 문서에서 확인 가능하다. 개념이 모호할...
Webhacking.kr 32번 문제
32 번 문제는 150 스코어의 문제입니다. 문제를 보면, 100명의 리스트가 존재합니다. 하단에 입장에 버튼이있는데 해당 버튼을 누르면 100명의 리스트에 제 계정이 추가됩니다. 이후 본인 계정에 클릭을하게되면 vote up 이 됩니다. 이후 스코어 1점이 추가되는데, 추가 이후에 추천을 누르면 no 메세지와 함께 추천이 안됩니다. 요소를 보니 클릭 시, 아래와 같은 이벤트가 발생합니다. location.href=’?hit=’본인 계정’ 추천과 동시에 vote_check 쿠키가 하나 생성됩니다. 보아하니 쿠키로 구분하여 추천 여부를 판별하는 것 같습니다. 일단 저는 아래와 같이 간단하게 스크립트를 하나 작성했습니다. 코드의 내용은 vote_check 라는 쿠키를 지운 후, 추천 요청을 하는 것 입니다. 특성 상, 이벤트가 발생하면 페이지가 새로 로드되기 때문에 저는 사용하고있는 크롬 확장 프로그램을 통하여 해당 스크립트를 기입해 문제를 해결 했습니다. 하단에 소스 코드를 기재했습니다. 코드 상 셀렉트 부분을 참고하시면 onclick^=”location.href=’+”‘?hit=hax0r’”+’” 이라 되어있는데, 여기서 hax0r 을 보인 계정으로 치환하시면 됩니다. hax0r 은 제 계정이에여. var delCookie = function(name) {    document.cookie = name + '=;expires=Thu, 01 Jan 1970 00:00:01 GMT;';};/* Node Select 를 위해...
Webhacking.kr 31번 문제
150 포인트의 문제다. 문제를 보면 port 라는 변수의 rand(10000,10100) 을 대입한다. 여기서 rand php 내부 함수는 정수 난수를 생성한다. rand 는 0과 getrandmax 사이의 임의의 난수를 반환한다. If called without the optional min, max arguments rand() returns a pseudo- random integer between 0 and getrandmax(). If you want a random number between 5 and 15 (inclusive), for example, use rand(5, 15). 이후 socket 이라는 변수에 fsockopen 함수를 대입한다. 위의 선언된 port 는 두번째에 위치해 있고, 첫 번째 인자에는 get 메소드의 server 파라미터가 담겨있다. 실질적으로 문제 페이지에 들어가면 아래 주소로 리다이렉트 된다. challenge/web/web-16/?server=175.196.156.178 여기서 server 파라미터에 값은 현재 요청한 클라이언트의 아이피, 즉 본인의 아이피가 되겠다. 그리고 하단에는 연결관련한 에러 문구(Connection refused)가 나온다. 문제를 보면 알겠지만, 저 파라미터 값의 대상의 포트를 10000, 10100 에 해당하는 번호로 열면된다. 정말 쉽게, 클리어 $port=rand(10000,10100); $socket=fsockopen(“$_GET[server]”,”$port”,$errno,$errstr,3) or die(“error : $errstr”); Warning: fsockopen() [function.fsockopen]: unable to connect to 175.196.156.178:10045 (Connection refused) in /home/hosting_users/webhacking/www/challenge/web/web-16/index.php on line 24 error...
HSTS (HTTP Strict Transport Security)
HTTP Strict Transport Security 를 사용하자. 301 리다이렉트 비용을 피할 수 있다. 해당 응답 헤더를 추가하면 서버는 브라우저에게 해당 사이트는 오직 “HTTPS” 프로토콜만 허용한다고 알려주게된다. 이 후 브라우저는 HTTP를 통하여 매번 접속 시 스킵하고 HTTPS 로 이동하게된다. http / https 양쪽 세션을 공유하는 경우에 취약점을 보안할 수 도 있다. 위키피디아에 기재된 HSTS 의 내용은 웹 사이트내 “Session Hijacking, agains downgrade attack” 을 대응하기 위해 만들어진 보안 매커니즘이라한다. HTTP Strict Transport Security (HSTS) is a web security policy mechanism which helps to protect secure HTTPS websites against downgrade attacks and cookie hijacking. It allows web servers to declare that web browsers (or other complying user agents) should only interact with it using secure HTTPS connections,[1] and never via the insecure HTTP protocol. HSTS is an IETF standards track protocol and is specified in RFC 6797. Nginx 기준 아래 헤더를 추가하면된다. add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; 참고한 자료 HTTP Strict Transport Security...
성능 향상을 위한 InnoDB File-Format Management
DB 설계, 필요 INDEX 생성, Optimizer 실행 계획 생성 등이 원활한 경우 남은 성능 최적화 작업 중 하나는 DISK I/O 를 줄이는 방법입니다. MySQL 에서 InnoDB 엔진을 사용하는 경우 Barracuda Format을 사용하여 DB의 크기를 50% 이상 감소 시킬 수 있습니다. 해당 포맷을 적재적소에 활용만 잘 한다면 데이터 저장 공간을 크게 절약하실 수 있습니다. (MySQL 5.1 이하 버전은 따로 플러그인을 설치해야한다.) 단 Barracuda 는 데이터 압축 및 해제하기 위해 CPU 자원을 소모한다는 것을 유의해야합니다. 기본적으로 InnoDB 에서 기본으로 설정 되어있는 파일 포맷은 “Antelope” 입니다. Antelope 과 Barracuda 의 차이점은 아래와 같습니다. Barracuda 파일 포맷에서는 “Compact” 이외에 “Dynamic”, “Compressed” Row 포맷을 지원합니다. Compact 가변 길이 컬럼의 767 byte 까지만 B-Tree에 저장하고, 나머지는 Off-Page에 저장 Dynamic Page 사이즈와, Row 사이즈를 고려하여, 길이가 긴 컬럼들은 전체를 Off-Page에 저장하되, B-Tree에는 20 byte의 포인터만 저장 (전체 칼럼을 데이터 트리에 넣도록 시도하고 그렇지 못한다면 별도의 페이지에 저장한다.) Compressed Dynamic과 거의 유사하지만 KEY_BLOCK_SIZE 옵션을 통해 16KB의 데이터 Page를...
MYSQL Workbench Data Export problem
Error executing task: 'ascii' codec can't decode byte 0xbf in position 26: ordinal not in range(128)Error executing task [Error 32] : 'c:\\users\\\xbf\xec\xbf\xb5\xc1\xd8\\appdata\\local\\temp\\tmpemnpwj.cnf'17:47:56 Export of C:\Users\우영준\Documents\dumps\Dump20170223 has finished 위 와 같은 에러가 발생한다면, 계정명을 영문으로 수정하거나 생성 후 다시 실행한다. character set 문제로 보임. seems that if the task temp folder cotains utf8 character, the execution will fail, and i have no way to change the task temp folder. 참고 사항 MySQL workbench failed to export a database
객체지향의 사실과 오해
블로그 포스트 이력을 보면 알겠지만, 난 요즘 클린코드의 매력의 매료되었다. 깔끔하고 직관적인 코드는 버그가 숨지 못 하고 좀 더 나은 소프트웨어를 만든다 생각한다. 포로그래머라면 한번 쯤 절차지향이란 무엇인가에 대해 고뇌아닌 고뇌를 해 봤을 것 이다. 이 책은 원론적면서도 다소 위험한 질문에 답하기 위해 쓰여진 책이다. 본 책에서의 핵심 객체지향의 핵심은 역할, 책임, 협력이다. 객체지향 설계의 목표는 자율적인 객체들의 협력 공동체를 만드는 것이다. 객체지향은 클래스를 지향하는 것이 아니라 객체를 지향하는 것이다. 클래스는 단지 구현 메커니즘일 뿐이다. 자율적인 책임이 자율적인 객체와 유연한 설계를 낳는다. 객체지향은 안정적인 도메인 구조에 불안정한 기능을 통합한 것이다. 객체가 메시지를 선택하는 것이 아니라 메시지가 객체를 선택하게 해야 한다. 참고 생각하라, 객체지향처럼 (우아한 형제들 기술 블로그) 객체지향의 사실과 오해 이터너티 (저자 : 조영호) 님의 블로그 책 설명