탭을 스페이스바 4개로 전부 '찾아바꾸기'를 하려고 했는데, 찾기에 탭을 입력하면 커서가 이동해버린다. ALT + 9 를 누르면 Tab이 입력된다!
GitHub - Octoping925/MobileEntropyHelper_ChromeExtension Contribute to Octoping925/MobileEntropyHelper_ChromeExtension development by creating an account on GitHub. github.com 📝 계기 내 회사에선 업무 기록을 위해 이슈를 레드마인에서 관리하고 있다. 하지만 매번 이슈가 들어올 때마다 레드마인에 등록하는 것은 여간 귀찮은 일이 아닐 수 없다. 그래서 레드마인 등록을 포함해서, 우리 회사에 만연하고 있는 쓸모없는 반복 작업을 대신해줄 수 있는 크롬 확장 프로그램을 만들어보고자 하는 생각을 했다. 🔍 조사 크롬 확장 프로그램은 웹 개발과 거의 다름이 없는 듯하다. 심지어는..
나는 2022년 08월 25일에 산업기능요원의 신분으로 취직을 했다. 코로나로 인해 학교를 가지 못 한 채 대학 생활이 끝나간다는 불안에 빠져, 도피성으로 선택한 산업기능요원이었다. 사실상 기존에 정보 올림피아드 공부를 해서 약간의 알고리즘 지식 이외엔 별다를 것이 없는 나였다만, 정말 다행히도 면접을 두 군데 보았고, 두 군데 모두 합격하게 되었다. 그리고 그 중에 한 곳이었던, M 회사에 입사해서 이렇게 1년의 시간이 지나게 되었다. 벌써 1년이라니! 별 다를게 없기도 했고 많은 것 같기도 한 1년을 정리해보고자 글을 쓰게 되었다. 👔 산업기능요원 취직 M 회사는 여러 도시가스 업체에 업무용 웹이나 프로그램을 만들어주는 등의 업을 하는 SI 회사이다. 난 그 곳에서 프로젝트들의 유지보수를 맡는 '서비..
Math.random() 을 통한 난수 만들기 Math.random() 함수를 이용하면 0이상 1 미만의 난수를 출력한다. 따라서 다음과 같이 난수를 뽑아낼 수 있다. // 0 이상 1 미만의 난수 구하기 Math.random(); // 두 값 사이의 난수 구하기 Math.random() * (max - min) + min; // 두 값 사이의 정수 난수 구하기 Math.floor(Math.random() * (max - min)) + min; window.crypto.getRandomValues()를 통한 난수 만들기 Math.random()은 암호학적으로 안전한 난수를 제공하지는 않다. 따라서 보안과 관련된 곳에는 window.crypto.getRandomValues()를 사용하자. self.cryp..
function dateFormat(format) { const weekName = ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"]; const d = new Date(); const lpad = x => String(x).padStart(2, '0'); return format.replace(/(yyyy|yy|mm|dd|e|24h|hh|mi|ss|a\/p)/gi, function($1) { switch ($1) { case "yyyy": return d.getFullYear(); case "yy": return lpad(d.getFullYear() % 1000); case "mm": return lpad(d.getMonth() + 1); case "dd": re..
C언어에서는 문자를 입력받을 때 scanf를 사용한다. scanf와 함께 %s라는 포맷 코드를 사용하면 문자열을 입력받을 수 있는데, 여기에는 한 문제가 있다. char txt[100]; int main() { scanf("%s", txt); printf("%s", txt); } /* [input] Hello, World! [output] Hello, */ 바로 공백을 만나면 문자열의 끝으로 인식하고 문자열을 읽기를 그만둔다는 점이다. 이럴 때는 gets 함수를 사용하면 쉽게 해결할 수 있다. char txt[100]; int main() { gets(txt); printf("%s", txt); } /* [input] Hello, World! [output] Hello, World! */
for문을 돌다가 중간에 break로 반복문을 빠져나오는 기능을 사용하는 일은 종종 있다. 그런데 다른 언어에서는 이게 반복문이 다 끝나서 빠져나온건지, 중간에 break를 통해 빠져나온 건지 확인하는 일이 은근 귀찮은데 반해 Python에서는 for-else 구문으로 쉽게 확인할 수 있다. for-else 구문이란? 반복문이 중간에 break 당하는 일 없이 끝까지 도는 데에 성공했을 경우 else 구문 안에 있는 내용을 실행한다. def printNums(num): for i in range(num): print(i, end=' ') if i > 4: break else: print("[Not breaked!]") # output: 0 1 2 3 4 5 printNums(10) # output: 0 ..
중복 코드는 여러 클래스나 메소드에 걸쳐서 완전히 동일하거나 혹은 비슷한 형태로 나타나는 등, 여러 형태로 나타날 수 있다. 중복 코드의 단점은 다음과 같다. 1. 한 코드를 변경할 때 동일한 모든 곳의 코드를 변경해야 한다. 2. 중복되는 코드들이 완전히 동일한 기능을 하는지, 혹은 비슷한 일을 하는지 잘 들여다봐야 한다. 이를 해결할 수 있게 해주는 리팩토링은 다음과 같다. 1. 함수 추출하기 (Extract Function) 2. 코드 분리하기 (Slide Statements) 3. 메소드 올리기 (Pull Up Method) 1. 함수 추출하기 (Extract Function) 동일한 코드를 여러 메소드에서 사용하는 경우 '함수 추출하기'는 중복 코드를 제거하는 상황 뿐 아니라, 정말 여러 상..
리팩토링을 하려면, 리팩토링이 필요한 코드를 찾아야하는데, 리팩토링 책에서는 그것을 냄새(Smell)라고 표현함. 깔끔한 코드에서 가장 중요한 것들 중 하나는 "좋은 이름"이다. 함수, 변수, 클래스, 모듈의 이름 등은 모두 어떤 역할을 하는지, 어떻게 쓰이는지 한번에 알아볼 수 있도록 직관적이어야 한다. 이를 이룰 수 있게 해주는 리팩토링은 다음과 같다. 1. 함수 선언 변경하기 (Change Function Declaration) 2. 변수 이름 바꾸기 (Rename Variable) 3. 필드 이름 바꾸기 (Rename Field) 1. 함수 선언 변경하기 (Change Function Declaration) 좋은 이름을 가진 함수는 그것의 이름만 보고도 함수가 어떻게 구현되었는지 이해할 수 있다...
비트마스킹은 이진법을 이용하여 적은 메모리로 데이터를 저장하는 기법이다 int arr[20]에 0 또는 1의 데이터를 저장하느니, 20자리의 이진수 숫자 하나에 비트 하나당 0, 1의 값으로 데이터를 저장하는 것이 훨씬 이득일 것이다. int bitmask = 0; // 초기화 // [ n번째 값 1로 만들기 ] bitmask |= (1