목록프로그래밍 (74)
Dharma
모든 지식은 시스템 내에서 단일하고, 애매하지 않고, 정말로 믿을만한 표현 양식을 가져야 한다. DRY - 반복하지 마라 (Don't Repeat Yourself) 어떻게 중복이 생기는가? - 강요된 중복 개발자들은 다른 선택이 없다고 느낀다. 환경이 중복을 요구 하는 것처럼 보인다. - 부주의한 중복 개발자들은 자신들이 정보를 중복하고 있다는 것을 깨닫지 못한다. - 참을성 없는 중복 중복이 쉬워 보이기 때문에 개발자들이 게을러져서 중복을 하게 된다. - 개발자간의 중복 한 팀에 있는 (혹은 다른 팀에 있는) 여러 사람들이 동일한 정보를 중복한다. 위 내용은 예전에 읽었던 '실용주의 프로그래머' 라는 책에서 나와 있는 드라이 원칙 입니다. 소프트 웨어를 작성할 때 필히 반복되는 환경에 대해서 어떻게 피..
페르마의 작은 정리 n 이 소수고 , a 가 n 보다는 작고 0 보다는 큰 정수라면 , a^n (a 의 n 승) 은 a modulo n 으로 맞아 떨어진다. 이러한 페르마 검사가 확실하게 소수를 판별하지는 못한다. 역이 성립이 안하기 때문이다. 즉 소수가 아닌데도 페르마의 작은 정리를 만족시키는 값이 존재하기 때문이다. 이러한 수를 카마이클 수 (Carmichael number)라고 하는데, 이 수는 아주 드물다는 점 밖에 알려진 성질이 없다. 1000,000,000 아래에는 25개가 있고 예를 들자면 (561, 1105, 1729, 2465, 2821, 6601) 사실 아주 큰 값을 마구잡이로 골라 그 수가 소수인지 알아볼 때, 페르마 검사가 틀릴 확률은 우주선 (우주에서 온 방사선 cosmic rad..
문혜군이 말했습니다. "참, 훌륭하도다. 기술이 어찌 이런 경지에 이를 수 있을까?" 요리사가 칼을 내려놓고 대답했습니다. "제가 귀히 여기는 것은 도입니다. 기술을 넘어선 것입니다. 제가 처음 소를 잡을 때는 눈에 보이는 것이 온통 소뿐이었습니다. 삼 년이 지나자 통째인 소가 보이지 않게 되었습니다. 지금은 신(神)으로 대할 뿐, 눈으로 보지 않습니다. 감각 기관은 쉬고, 신(神)이 원하는 대로 움직입니다. 하늘이 낸 결을 따라 큰 틈바귀에 칼을 밀어 넣고, 큰 구멍에 칼을 댑니다. 이렇게 정말 본래의 모습에 따를 뿐, 아직 인대나 건을 베어 본 일이 없습니다. 큰 뼈야 말할 나위도 없지 않겠습니까? 훌륭한 요리사는 해마다 칼을 바꿉니다. 살을 가르기 때문입니다. 보통의 요리사는 달마다 칼을 바꿉니다...
In programming, the best way to learn is often to begin experimenting as soon as possible. A full theoretical understanding can come later. - OnLisp 중에서 프로그래밍을 배우는데 있어서 가장 좋은 방법은 가능한한 빠르게 실험을 해보는 것이다. (빠르게 예제를 짜보는 것) 전반적인 이해는 흔히 그 다음에 온다는 것이 폴 그레이엄이 말하는 방법입니다. 종종 프로그래밍을 공부한다고 치면 매뉴얼 부터 세세히 읽어가기 시작하면 금새 꿈나라로 가는 경우가 다반사기 때문에 후다닥 목차정도만 훓고 빠르게 이거 저거 짜보는 게 확실히 빠른 이해가 됩니다. 나이키 광고가 가지는 뜻이 절실해 지는 군요 프로그..
클로져를 이용해서 웹 어플리케이션 간단한 것을 만들어 보고 싶은 욕망이 있을 것입니다. 만들어 보고 싶은 욕망은 의외로 간단하게 해결이 됩니다. 바로 컴포져(Compojure) 를 이용하면 쉽게 만들 수가 있습니다. 예전 포스트 를 보고 클로져 개발환경이 세팅되어 있다고 가정합니다. compojure 로 만들어진 예제를 다운 받습니다. $ cd ~/work (없으면 만들어 줍니다) $ git clone git://github.com/weavejester/compojure-example.git $ cd compojure-example $ lein deps $ lein ring server 이렇게 하고 좀 오랜 시간을 기다리면 Port 3000 번에 Jetty 를 이용한 어플리케이션 서버가 떠 있는 것을 확..
boost 1.46 버젼, 쓰리프트 0.8.0 버젼을 기반으로 하여 스크라이브를 설치하는 방법입니다. 스크라이브는 현재 4년간 소스에 변동이 없습니다. 따라서 최신 라이브러리 기반으로 컴파일 할려고 하면 알려준 방법대로 되지 않습니다. 1. 부스트 설치 $ sudo apt-get install libboost-all-dev libevent-dev automake libtool flex bison pkg-config g++ libssl-dev 언제나 우분투 (Debian) 계열 (민트도 우분투 계열이라고 볼 수 있으니..) 이라고 가정하고 이야기 할 것입니다. 2. 쓰리프트 (Thrift) 설치 $HOME/work 밑에 설치한다고 가정하고 $ cd ~/work $ git clone git://git.apa..
저번 포스트 에서 Clojure 와 Emacs 와 Slime 을 연동 시키는 방법을 했다면, 이제 실제 클로져 코드를 짜야 하는 일이 생길 것입니다. 그런데 전역으로 환경을 세팅하는 것이 아니기 때문에 다른 클로져 라이브러리를 포함 시키는 것이 어려울 것 같습니다. 특히 clojure-contrib 같은 거의 필수 라이브러리는 lein 으로 만들어준 프로젝트의 project.clj 를 열어줍니다. $ lein new test-project $ cd test-project $ emacs project.clj 다음 과 같이 [org.clojure/clojure-contrib "1.2.0"] 의 내용을 :dependencies 에 추가해 줍니다. 아래에 붙어 있는 congomongo 는 무시하세요. $ lei..
프로젝트를 만들다 보면 너무나 당연하게 디펜던시를 가지는 프로젝트가 생기게 됩니다. 메이븐은 기본적으로 디펜던시를 가져다가 프로젝트를 만들게 되는데 이를 수동으로 해야할 필요가 생긴다면 어떻게 할 것인가? 하는 문제가 있습니다. 즉 A : 실행파일이 만들어지는 프로젝트 B : A 가 참조하는 프로젝트 C : B 가 참조하는 프로젝트 A - - B - - C 이런식으로 아마 만들어지는 것이 지금까지의 일반적인 방법일 것입니다. 그러나 메이븐에서 관리를 하게 된다면 조금 다른 식이 됩니다. P (parent) 가 존재해서 P - A - B - C 같은 식으로 프로젝트가 존재하게 됩니다. 그리고 각각은 pom.xml 만 수정해서 프로젝트를 관리할 수가 있습니다. 그래서 수정해야 할 부분을 따라하기로 만들어 보..
몽고 DB 에서 간단한 맵 리듀스 (MapReduce)를 돌려보겠습니다. 예제의 원문은 http://cookbook.mongodb.org/patterns/pivot/ 에서 찾을 수 있습니다. db.actors.insert( { actor: "Richard Gere", movies: ['Pretty Woman', 'Runaway Bride', 'Chicago'] }); db.actors.insert( { actor: "Julia Roberts", movies: ['Pretty Woman', 'Runaway Bride', 'Erin Brockovich'] }); 기본이 되는 데이터를 집어 넣습니다. map = function() { for(var i in this.movies){ key = { movie: ..
이렇게 저렇게 해도 콘솔라스 폰트를 구하기 어려울 때를 대비해서 올려둡니다.