백준 1018번 체스판 다시 칠하기 write-up

#!/usr/bin/env python3 # coding: utf-8 def set_plate(): n, m = map(int, input().split()) plate = [] for i in range(n): row = list(input()) plate.append(row) return n, m, plate def get_repaint(plate): result = [] row = [ ['W', 'B'] * 4, ['B', 'W'] * 4 ] for i in range(2): repaint = 0 for j in range(8): check = row[(i + j) % 2] for k in range(8): if plate[j][k] != check[k]: repaint += 1 result.app..

Chrome Extension을 통한 수강신청 사이트 키 금지 기능 무효화

아직 20학번 새내기라서 수강신청을 해본 적은 없다. 그러나 주변에서 [Tab]와 [Spacebar]만으로 수강신청을 마스터할 수 있었지만 대학교 수강신청 사이트에서 이를 막는 추세라서 이제는 빠르게 수강신청하기가 어려워졌다는 소문을 들은 적이 있다. 오늘 학번을 발급받은 김에 이 현상을 확인해보려고 경희대학교 수강신청 사이트에 접속해보았는데 역시나 F5, 스페이스바 등의 키가 금지되어있었다. 해당 키를 금지하는 기능은 당연히 Javascript 단에서 onkeydown 등의 event를 일일이 검사하는 방식으로 수행될 것이라고 생각했다. 역시는 역시. 아래는 경희대학교 수강신청 사이트에서 키 입력 금지 메커니즘을 구현한 코드이다. function noKeyCheck(){ if (event.keyCode..

Pub/Sub 계층을 통한 프로그래밍

만약에 어떠한 사이트에 사용자가 가입하는 경우 사이트는 사용자에게 사용자의 정보를 받고 DB에 저장하고 e-mail을 보내고 Event Tracker를 통해 로그를 저장하는 등 다양한 procedure를 거칠 때가 많다. 이 때 코드를 한 번에 다 때려박곤 했었는데 이게 크게 잘못된 생각임을 알게 되었다. 다음과 같은 코드가 내가 평소에 쓰던 방식이다. import UserModel from '../models/user'; import CompanyModel from '../models/company'; import SalaryModel from '../models/salary'; export default class UserService() { async Signup(user) { const userR..

파이썬 가비지컬렉션

보통 C언어로 코딩할 때는 가비지컬렉션이 구현되어 있지 않아서 프로그래머가 직접 가비지컬렉션 기능을 사용하거나, 가비지컬렉션이 구현된 헤더파일을 include 하는 방식을 사용하는데 파이썬에서는 인터프리터단에서 자동으로 이 기능을 지원한다. 이 때 쓰이는 개념이 '레퍼런스 카운트'다. 레퍼런스 카운트란 말 그대로 '참조 수'인데, 다음과 같은 예시로 쉽게 이해할 수 있다. >>> var1 = [1,2,3] # Reference Count = 1 >>> var2 = var1 # Reference Count = 2 >>> var1 = 'python' # Reference Count = 1 >>> var2 = 1.0 # Reference Count = 0 주석으로 달아놓은 Reference Count는 [1,..

js, css 로드할 때 ?v={random_num} 붙이는 이유

css, js, 혹은 미디어 파일을 로드하는 경우 파라미터로 이상한 값을 넘기는 경우가 많은데 이 경우는 왜 그런건지 궁금했습니다. 이렇게 로드하지 않으면 css, js 혹은 미디어 파일이 캐시에 남아있게 되는데, 이 경우에 로드하는 파일의 내용이 변경되어도 캐시에 저장되어 있기 때문에 refresh가 되지 않는 현상이 발생할 수 있습니다. 따라서 ?v={버전} 혹은 ?v={랜덤넘버} 를 붙여 로드하는 방식을 사용하는 것입니다.

scanf가 씹히는 경우

레드벨벳 조이 C언어로 코딩을 하는 경우 무한루프 ( while (1), for (;;) ) 안에서 scanf() 함수를 호출하여 값을 연속적으로 받고 연산을 하는 경우가 많다. 근데 이 경우에 scanf()가 씹히는 경우가 빈번히 생기는데, 이 때의 해결법을 써보도록하겠다. scanf()가 씹히는 경우는 버퍼에 사용자가 입력한 것이 남아있기 때문이다. %c를 받는 경우엔 \n (0x0a) 도 버퍼에 들어가기 때문에 scanf() 함수에서는 다음 루프를 돌 때 입력받은 값이 \n (0x0a) 된다. 이 경우에는 내가 생각한 두 가지의 해결책으로 해결할 수 있다. 1. scanf() 함수 뒤 getchar() 함수를 사용한다. - scanf() 함수 뒤 getchar() 함수를 사용하면 scanf()를 호..

웹페이지 로딩 느릴때 팁

레드벨벳 아이린 빨간맛 오프닝 가끔 웹 프로그래밍을 하다보면 bootstrap.min.css, jquery.min.js 에서 웹페이지가 로딩되는 속도를 무지하게 잡아먹는 경우가 있는데 이 때는 https://www.jsdelivr.com 에서 해결 가능하다. 다양한 버전별로 로드할 수 있어서 더 좋음ㅋㅋ 내가 현재 개발하고 있는 nCTF 프레임워크도 cdn을 쓰기 시작하고부터 페이지 로딩 속도가 매우 빨라짐을 체감할 수 있었다... [*] url : https://github.com/ch4n3-yoon/nCTF/commit/954b0ec4428f9c5a391499ed3210adfb663bec4c 하긴 원래는 {user}.github.io 써서 더 드렸던 이유도 있었음ㅋㅋㅋㅋ

javascript 일반 함수와 화살표 함수

javascript에서는 일반적으로 함수를 선언하는데 크게 두 가지의 방법을 갖고 있다. 첫 번째 방법이 바로 일반적으로 사용하는 function () {} 같은 방법이고 두 번째가 화살표 함수이다. 화살표 함수라는 용어 자체는 Mozilla 의 Web Docs에서 가져왔다. 화살표 함수는 선언할 때 다음과 같은 방법을 사용한다. () => {} 처음에 Javascript를 배우기 시작했을 때는, 일반적인 방법과 화살표 함수의 선언 방식은 그저 인자를 선언하는 방법만 다르다고 생각했으나 Vue.js 를 배우면서 큰 차이점을 알게 되어 블로그에 글을 남긴다.

PHP의 new execution generation..

Redvelvet Irene PHP에서 문자열 내에서 RCE를 일으킬 수 있는 트릭을 발견했다. $a = 'phpinfo';echo "${$a()}"; 사실 이미 알고 있었을 수도 있다. PHP는 이런 점에서 정말 재미있는 것 같다.