잡학(雜學) 13

sublime text - 자동 저장

sublime text는 텍스트 에디터이며, 다양한 기능들을 제공한다. sublime으로 파일을 열어 텍스트 편집하다가 저장을 누르지 않고, sublime을 종료하면, 파일에는 편집한 내용이 저장되지 않고, sublime을 통해서 열 때만 편집한 내용이 나온다. 텍스트 편집기를 sublime만 쓰는 것이 아닌 경우, 이러한 것이 무척 거슬린다. 이 포스트에서는 이러한 것을 해결하는 설정 방법을 포스팅한다. 자동 저장 설정 메뉴의 Preferences > Settings 을 선택하면, 2컬럼으로 왼쪽 칼럼에 sublime의 기본 설정을 보여주고, 오른쪽 칼럼에 사용자 설정을 할 수 있는 화면이 나온다. { "save_on_focus_lost": true, } 위와 같이 오른쪽 칼럼에 설정하면, 1) sub..

잡학(雜學) 2021.09.02

Openstack - 이미지 등록

Openstack을 설치한 이후에 처음으로 기본 이미지로 서버(혹은 인스턴스)를 생성할 때, 이상하게 이미지에 문제가 있어서 서버가 생성되지 않는 경우가 있다. Packstack으로 설치하는 경우, cirros가 기본으로 등록되어 있다. (설치 옵션에서 따라 cirros가 등록되지 않을 수 있다.) 이 포스트에서는 새로운 cirros 이미지를 내려받고, 이를 Openstack에 등록하는 방법에 관해 서술한다. 이미지 획득 cirros 이미지는 http://download.cirros-cloud.net/ 에서 내려받을 수 있다. 하지만 굳이 들어가는 건 귀찮으므로, 커맨드를 사용한다. CIRROS_VERSION=$(curl -s http://download.cirros-cloud.net/version/re..

잡학(雜學) 2021.09.01

스크럼 수행 순서

Product Backlog 작성 User Story 들을 작성한다. User Story는 중요도가 높을수록 상단에 위치하게 한다. 상단의 User Story가 Sprint 동안 수행할 수 있지 않으면, User Story를 쪼갠다. Sprint Planning 회의 Sprint 동안 어떤 User Story를 할지 결정한다. 선택된 User Story의 인수 기준을 결정한다. Sprint Backlog 작성 User Story를 완수하는 데 필요한 task 들을 작성한다. task를 개발자에게 할당한다. Sprint 시작 보통 한 번의 Sprint는 2주 동안 진행한다. 일일 스크럼 회의 매일 15분 정도 간단하게 진행한다. Sprint 진행에 방해가 되는 모든 요소에 관해 이야기한다. (자신의 건강상..

잡학(雜學) 2021.08.31

boilerplate code(보일러플레이트 코드)

보일러플레이트 코드(이하 BP)는 최소한의 변경으로, 혹은 변경 없이 재사용할 수 있는 코드를 말한다. BP는 단순히 생각하면 반복되는 코드이다. 이는 가독성을 저하하고, 변경을 어렵게 만든다. 궁극적인 문제는 개발자를 귀찮게 만든다는 것이다. 이를 해결하기 위해서 리팩토링을 통해 중복 제거를 할 수도 있으나, 불가능한 예도 있다. 예시) public class Person { private String name; public String getName() { return name; } public void setName(String newName) { this.name = newName; } } 위의 코드는 별로 문제가 없어보이지만, Q) 만약 Person 클래스의 필드가 30개라면? - 그에 해당하는..

잡학(雜學) 2021.08.29

Rust 2장 - 3. 문자열

원래는 문자열을 이렇게 빠르게 포스팅할 생각이 없었는데, rust로 알고리즘 문제 풀다가 문자열이 너무 이상해서, 공부 겸 먼저 올립니다. 문자열 타입 Rust에는 두 가지 타입의 문자열이 있다. String과 &str이다. String 특징 Vec를 가지는 구조체 UTF-8 보장 힙 영역의 데이터 내용 변경 가능 null terminated가 아님! &str 특징 &[char] 슬라이스 UTF-8 보장 스택 영역의 데이터 문자열 타입 지정 fn main() { let s = "ABCD"; println!("{}", s); } 위와 같이 "ABCD"를 지정하는 경우, &str 타입으로 취급된다. String 타입을 지정하고 싶은 경우 아래와 같이 만들면 된다. fn main() { let s = "ABC..

잡학(雜學) 2021.06.24

Rust 2장 - 2. 기본 데이터 타입

Rust의 기본 데이터 타입은 크게 Scala 타입과 Compound 타입으로 이루어져 있다. Scala 타입은 하나의 값만을 가지며, Compound 타입은 여러 개의 값을 가진다. Scala 타입 정수형, 실수형, 불(Bool)형, 문자(char)형이 있다. 분류 표현 크기(byte) 정수형 부호 있는 i8 1 i16 2 i32 4 i64 8 i128 16 isize 아키텍쳐 32bit => 4 64bit => 8 부호 없는 u8 1 u16 2 u32 4 u64 8 u128 16 usize 아키텍쳐 32bit => 4 64bit => 8 실수형 f32 4 f64 8 불형 bool 1 (1바이트다!) 문자형 char 4 (유니코드 지원) 정수형의 표현 방식 fn main() { let decimal1 ..

잡학(雜學) 2021.06.17

Rust 2장 - 1. 변수와 상수

변수 Rust는 정적 타입(Statically Typed) 언어이다. Rust의 변수 선언은 let 키워드 사용하며, 기본적으로 불변(immutable)이다. 변수는 변하는 수를 말하는데 불변이라고 하니 뭔가 이상하다. 근데 그냥 그렇다고 치고 넘어가자. fn main() { let x = 10; x = x + 1; println!("{}", x); } 위와 같이 변수를 사용할 경우, 아래와 같은 에러가 발생한다. error[E0384]: cannot assign twice to immutable variable `x` --> src/main.rs:3:5 | 2 | let x = 10; | - | | | first assignment to `x` | help: make this binding mutabl..

잡학(雜學) 2021.06.15

억지 기법

억지 기법(brute force)은 가장 단순한 알고리즘 기법이다. 이 기법은 "문제 정의를 가장 그대로 반영한 알고리즘" "무식하게 모든 경우의 수에 대해 처리를 하는 알고리즘" 정도로 정의할 수 있다. 아래와 같은 간단한 문제가 있을 때, "1부터 10까지의 합을 출력하라" 아래와 같이 간단하게 푸는 방법이 존재한다. fn main() { let mut sum = 0; for i in 1..=10 { println!("{}", i); sum += i } println!("{}", sum); } 이처럼 문제의 정의를 그대로 적용하는 것을 억지 기법이라고 한다. 이러한 문제는 10회만 반복하지만, 만약 10억 회를 반복하는 경우라면? 점점 수행속도가 느려지게 될 것이다. 이러한 문제는 수학적 정의를 사용..

잡학(雜學) 2021.06.13