콘텐츠로 건너뛰기
Home » 21세기소년 » Page 10

21세기소년

21세기소년 / IT / 정보기술 / 인터넷 / 프로그래밍 / 미래 / 과학 / 과학지식 / 물리 / 화학 / 천문 / 생물학 / 이과생이나 관심가질 법한 자질구레한 이야기들

루카스-레머테스트

메르센소수 어느날 지식인에 메르센 소수를 판별하는 파이썬 프로그램이 필요하다는 질문이 올라왔다. 질문자는 대학생인걸까? 루카스-레머 테스트는 메르센소수(소수 p에 대하여 도 소수인 경우)를 판별하는 알고리듬이다. 참고 : https://en.wikipedia.org/wiki/Lucas%E2%80%93Lehmer_primality_test 아래코드는 해당 알고리듬을 파이썬으로 구현한 것이다. 소수 p를 받아서 메르센소수인지를 검사한다.

난수생성을 위한 조금 더 나은 선택 – arc4random

전통적인 C 함수로 srandom, rand를 이용해서 난수를 생성하는 방법이 있는데, 보다 진보된(?)형태의 함수로 arc4random 함수가 있다. 이 역시 표준 C 라이브러리(libc)에 탑재되어 있다. (GCC 버전 요구사양은 잘 모르겠다.)

u_int32_t arc4random(void);

이 함수는 32비트 범위값 내에서 정수의 형태로 난수를 생성하며, rand(), randome() 함수에 비해 두 배의 범위를 가진다. 게다가 seed 값을 미리 정의해줄 필요도 없다.

더 보기 »난수생성을 위한 조금 더 나은 선택 – arc4random

NSArrayController explained

배열 컨트롤러 배열 컨트롤러는 일련의 객체 집합을 다루는 바인딩 호환 객체이다. 여기서 ‘집합’은 주로 NSArray인데, 코어데이터 등에서는 NSSet을 쓰기도 한다. 배열 컨트롤러는 배열이 아니고 별도의 배열을 관리한다. 이는 배열을 자동으로 재정렬하거나, 선택된 객체들을 기억하거나 하는 배열 자체에 저장될 수 없는 몇 가지 메타 정보를 가지고 배열을 다루는 것을 도와준다. 배열 컨트롤러는 NSObjectController의 서브클래스로, 다음 메소드를 통해서 초기화할 수 있다. – (instancetype)initWithContent:(id)content 다시 NSObjectController는 NSController의 자손인데, 이 컨트롤러는 객체의 편집 과정에 따른 이벤트를 발생시키는 기능을 갖고 있다. -objectDidBeginEditing: -objectDidEndEditing: -commitEditing -commitEditingWithDelegate:didCommitSelector:contextInfo:… 더 보기 »NSArrayController explained

코코아 바인딩이란

코코아 바인딩

기능적인 측면에서 가장 단순하게 설명하면, 코코아 바인딩은 모델과 뷰 사이에 어떠한 글루코드 없이 값과 디스플레이되는 것을 동기화시키는 것이다. 즉 바인딩을 구성하면 코드상에서 어떤 프로퍼티의 값이 변경될 때 별도의 업데이트 코드를 작성하지 않더라도 자동으로 뷰가 업데이트되고, 반대로 뷰에서 사용자가 값을 조작하는 이벤트가 발생하면 역시 아무런 코드가 없더라도 연결된 프로퍼티 값이 변경되게 하는 것이다.

코코아 바인딩은 코코아의 기본 기술들을 결합하여 구현되는데, 작성/유지해야 하는 코드의 양을 최소화하면서 뷰와 모델간의 바인딩을 거의 공짜로 제공한다. 클래스를 작성할 때, 키밸류 컨벤션만 따랐다면, 코코아 바인딩을 적용하기 위해서 기존 코드를 재작성할 필요도 없다.

더 보기 »코코아 바인딩이란

Fast Fibonacci Transform

큰 N에 대해서 N번째 피보나치 수를 구하기 피보나치 수열의 일반항을 구하는 함수에 대해서 오일러 프로젝트 관련 글에서 한 번 언급한 적이 있는데, 점화식을 그대로 정직하게 코드로 옮겨놓은 경우, 극히 작은 일부 n에 대해서만 실용성이 있을 정도로 비효율적이다. 35 정도를 넘기면 느려지기 시작하는데 40정도만 되어도 처참한 성능을 보여준다. 성능을 개선하기 위해서 메모이제이션 같은 테크닉을 사용할 수 있다. 미리 계산한 결과를 저장해두고 있다가 재계산을 피해서 반복횟수를 줄이는 방법이다. 메모이제이션 기능을 수행하는 데코레이터를 작성하여 함수 구현의 변경 없이 메모이제이션을 적용할 수 있다. 똑같은… 더 보기 »Fast Fibonacci Transform

UIApplicationMain

UIApplicationMain UIKit에서 앱의 런칭 프로세스를 처리하는 함수. UIApplication 객체를 생성하고, 앱의 기본 설정을 Info.plist 파일로부터 읽어들인다. int UIApplicationMain(int argc, char *argv[], NSString *pricipalClassName, NSString *delegateClassName); principalClassName : UIApplication 클래스를 서브클래싱한 경우 해당 클래스 이름을 전달한다. nil을 쓰는 경우 이 값은 UIApplication으로 고정된다. delegateClassName : 앱 델리게이트 클래스 이름. 만약 nib 파일 내에 앱 델리게이트 객체가 정의되어 있다면 nil을 전달해야 한다.

Swift :: 1.2의 커리드함수와 함수 합성에 대해

커링

Swift 1.2부터는 커리드 함수를 만들 때 파라미터 이름을 생략할 수 있게 되었다.1 함수를 커리드함수로 정의할 때

func f(a:Int)(b:Int)(c:Int) -> Int {
    return a * 2 + b * 3 + c * 5
}
let a = f(1)
let b = a(b:2)
let c = b(c:3)

이런식으로 커리드된 함수에서는 파라미터 이름을 반드시 넣어야 했는데, 이렇게 부분적용함수의 나머지 인자에 대해 반드시 이름을 쓰는 것만 허용이 됐었다. 이 경우에는 부분적용함수를 실제로 호출하는 경우, 반드시 해당 파라미터 이름을 기술해야하므로, 원 함수의 시그니쳐를 알지못하면 쓰기가 어렵기 때문에 활용할만한 곳이 많이 않았다. 하지만 Swift 1.2에서부터 이런 제한이 없어지고, 아래와 같이 2차 이후 부터의 인자 외부 이름을 생략하는 것이 허용됐다.더 보기 »Swift :: 1.2의 커리드함수와 함수 합성에 대해

양음력 날짜 변환 데이터 얻기

예전 한국천문연구원에서 운영하던 천문우주지식 정보 사이트에서 양/음력 변환기를 제공하면서, 관련된 알고리듬이나 데이터를 따로 제공해주지 않아서 말이 많았었는데, 시간이 오래 지나고 세상이 바껴서 그런지 이제 양음력변환은 오픈 API를 통해서 구할 수 있다. 그 외에도 네이버 캘린더 등을 통해서 양음력 변환이 가능하니, 방법은 많이 있다고 봐도 좋겠다. (업데이트 2022년 2월) https://www.data.go.kr/data/15012679/openapi.do 참고로 우리 나라에서 사용하는 음력 달력은 한국천문연구원에서 계산하여 발표하는 결과를 사용하고 있으며, 만년력 개념으로 두고두고 적용할 수 있는 일반적인 알고리듬이 공개되어 있지는 않다. (비공개라기 보다는 매년 측량을 통해서 오차를 갱신하고 필요한… 더 보기 »양음력 날짜 변환 데이터 얻기