티스토리 툴바


양자역학에서 필수적인 파동함수를 해석하는 데에는 두가지 시각이 있다. 첫째는 파동함수가 물리적 실체라는 것이고 두번째는 파동함수 자체가 존재하는것이 아니라 파동함수는 macroscopic하게 관측을 할때 통계적으로 값을 주는 변수에 불과하다는 주장이다. 즉 이 두번째 주장은, 파동함수는 실제 통계적인 추측보다 많은것을 담고 있으므로 뭔가 정보가 더 있다는 시각이다.

이 논문은 두번째 시각이 틀렸다는것을 증명한다. 증명 자체는 간단하다. 먼저, 어떤 물리계의 실제 물리적 실체를 생각해보자. 만약 첫번째 시각이 맞다면, 실제 물리적 실체는 파동함수를 포함할 것이고 따라서 파동함수가 다르다면 물리적 실체도 다를것이다. 하지만 두번째 시각이 맞다면, 물리적 실체가 같지만 우리가 식으로 쓴 파동함수는 다를수가 있다.

예를들어  \(|\phi> = \frac{1}{\sqrt{2}} (|0>+|1>)\) 의 경우 "얘는 그냥 \(|0>, |1>\) basis로 관측했을때 1/2확률로 1이고 1/2의 확률로 0이 나오는 상태이다." 라는 시각이 있다고 하자. 그러면 이런 통계적인 주장은 \(|\phi> = \frac{1}{\sqrt{2}} (|0>-|1>)\)에도 똑같이 적용된다. 즉, 우리가 식으로쓴 파동함수가 다른것이다. 이것은 꼭 이런종류의 주장 뿐만 아니라 더 강한 통계적인 주장(파동함수에 대한 정보를 좀더 많이 담은)에 적용된다.

즉, 실제 물리계는 통계적으로 완벽히 기술되는데 반해 파동함수는 통계적인 추측보다 더 많은것을 담고있기 때문에, 뭔가 정보의 잉여가 생기고 따라서 같은 물리계를 기술할수 있는 다른 파동함수가 존재한다는 것이다. 논문은 classical analogy를 들어 설명하는데 그것도 덧붙인다.

동전을 던지는 두가지 방법이 있다고 가정하자. 만약 이때 동전을 던져서 나오는 결과의 통계적 분포가 실제 물리적인 실체고, 동전의 위치, 운동량 등은 실제 물리적인 실체가 아니라고 가정하자. 두가지 방법 모두 앞면이 나올 가능성이 0이 아니라고 하자. 그러면 동전을 던져 앞면이 나온 경우 이것이 첫번째 방법을 써서 던진건지 두번째 방법을 써서 던진건지 알수가 없다. 따라서 두가지 방법의 결과가 compatible하다.

즉, 어떠한 물리적 실체가 완벽히 통계적이라면, 그 실체의 특정한 시행에 대한 값은 이것도 가능하고 저것도 가능하다는 것이다. 여기까지 왔으면 결론은 쉽다. 이제 양자상태를 준비하자. 동전을 던질때와 마찬가지로 두가지 방법으로 양자상태를 준비하자. 첫번째 방법은 \( |\phi_0> = |0>\)를 준비하고, 두번째 방법은 \(|\phi_1> = |+> = (|0>+|1>)/\sqrt{2}\) 를 준비한다. 실제 물리적인 실체과 완벽히 통계적이라면, 측정 결과가 이 두 방법중 무엇을 썼는지 알수 없을 확률이 있을것이다.  그 확률을 \(q\)라고 하자.

그러면 준비는 끝났다. 이 준비하는 기계를 두개를 놓고 그것을 한곳에서 측정하자. 그러면 일단 측정기계에 도달했을때 상태는 \(|0>\otimes|0>\), \(|0>\otimes|+>\), \(|+>\otimes|0>\), \(|+>\otimes|+>\)  네개중에 하나일것이다. 그리고 \(q^2\)의 확률로 네 상태가 compatible할 것이다.

그런데 다음 basis로 측정하는 경우를 살펴보자.
$$
|\xi_1> = \frac{1}{\sqrt{2}}(|0>\otimes|1> + |1>\otimes |0>),
$$$$
|\xi_2> = \frac{1}{\sqrt{2}}(|0>\otimes|-> + |1>\otimes |+>),
$$$$
|\xi_3> = \frac{1}{\sqrt{2}}(|+>\otimes|1> + |->\otimes |0>),
$$$$
|\xi_4> = \frac{1}{\sqrt{2}}(|+>\otimes|-> + |->\otimes |+>),
$$ 
이때 \(|-> = (|0> - |1>)/\sqrt{2}\)이다. 하지만 이 경우 첫번째 상태\(|0>\otimes|0>\)를 basis의 첫번째 원소로 측정하면 결과는 0이다. 두번째 상태는 두번째 원소로 측정하면 0 이고 세번째와 네번째도 마찬가지이다. 따라서 모순이 발생한다. \(q^2\)의 확률로 우리는 네가지 상태가 모두 물리적 실체와 compatible해야 하는데 측정을 하면 우리는 무슨 state가 맞는지 알 수 있다. 따라서 물리적 실체가 순수히 통계적이고 상태벡터는 그것을 표현하는 수단이지 물리적 실체가 아니라는 주장은 잘못된 것이다.

여기까지가 논문의 앞 2페이지 요약이고 뒤에는 이것을 일반적인 상태에 대해서 일반화 시키는 내용과 실험적 오차를 고려하는 상황이다. 요 아래는 개인적인 comment.

이게 contextuallity와 별로 다른 개념은 아닌것 같은데 아직을 잘 모르겠고, 항상 양자역학이 고전적인 해석이랑 다르다는 데에는 entanglement가 관여하는 것을 봐서 뭔가 entanglement가 정말로 고전적으로 nontrivial한 것인것 같다. 뭔가  이와 관련된 공부를 좀 해봐야 할듯.
저작자 표시
Posted by CECRI
Django 의 forms.ModelChoiceField 는 보통 ModelForm 에서 ForiegnKey 를 받기 위해 사용된다. 하지만 ForiegnKey 로 사용될 수 있는 객체가 제한적이라면 queryset 인자를 통해 선택할 수 있는 옵션을 제한 할 수 있다. 예를들어, Board 모델과 Category 모델, Article 모델이 존재한다고 해 보자. Article 은 게시판의 글을 나타내며 Board 와 Category 에 속한다. Category 는 각각의 게시판에서 존재하는 분류를 타나내고 Board 에 속한다. 이 경우 Article 을 쓰기 위해 Form 을 만들 경우 ModelForm 을 사용 할 것이다. 하지만, 이러한 경우는 모든 Category 를 선택할수 있게 하면 안된다. 현재 Article이 써지려는 Board와 같은 Board에 속하는 Category 만 선택가능하도록 해야 할 것이다. 이런 경우 동적으로 ModelForm의 category를 오버로딩 해야 한다. 이때 아랴와 같이 하면 된다.
class ArticleForm(forms.ModelForm):
    def __init__(self, board, *args, **kwargs):
        super(ArticleForm, self).__init__(*args, **kwargs)
        self.fields['category'].queryset = Category.objects.filter(board=board)
        self.fields['category'].empty_label = u"선택안함"
    
    class Meta:
        model = Article
        fields = ('category', ... blah blah ...)

사실 잘 생학해 보면 Category 에 이미 Board 에 대한 정보가 들어가 있으므로 Article 에 딱히 Board 가 필요하지는 않지만 일종의 역정규화를 시킨 것으로 이해하면 된다. 이러한 경우 위와 같이 사용하여 Category 의 선택을 제한 할 수 있다.
저작자 표시
Posted by CECRI

전에 CakePHP에 대한 글을 한번 쓴 적이 있다. 그때는 CakePHP를 가지고 동아리 홈페이지를 만들고 있었는데 느린 속도와 코드의 지저분함때문에 결국에는 별로 계속 코딩을 하고싶은 욕구가 생기지 않았다. 누가 돈주는 것도 아니고 결국 내 자신이 동기부여가 안되면 더이상 진행이 안되기 때문에 좀더 구조가 좋은 다른 프레임워크를 생각해 보았다.

처음에는 PHP계열 프레임워크를 알아보다가 내가 CakePHP가 싫어진 이유도 PHP자체의 문제가 한몫 한다고 생각해 아예 다른 언어 기반의 프레임워크를 찾기 시작했다. CakePHP는 클래스 상속을 통해 많은 기능을 DRY(Don't Repeat Yourself)시켜 주는데 일단 PHP가 PHP5부터 제대로 된 객체지향을 지원하지만 아직 프레임워크가 PHP4기반이라 클래스 내부 구현이 별로 이쁘지가 않다. 게다가 제일 큰 문제점은 DB에 접근하기 전에 reculsive를 설정하여 얼마나 연관된 테이블까지 가져올 것인가를 먼저 정해야하는 것이었다. 이것도 사실 객체지향형 설계를 잘해 lazy evaluation을 하면 되는 것인데 결국은 이걸 잘 못하는 PHP랑 관련되어 생긴 문제였다. 도대체 왜 객체지향형 프레임워크에서 User와 연관된 Group정보에 접근하는데 $this->User->data['Group']['field_name']을 써야 하는가. 게다가 load하기 전에 $this->reculsive = 0 정도는 미리 해 주어야 한다. 이걸 굳이 프로그래머가 생각해서 몇번째 연관된 자료까지 필요하니 $this->reculsive를 얼마로 놓아야지 라고 하는것 너무 세련되지 못하다. user->group->get('field_name')정도가 훨씬 간단하고 보기도 좋지 않은가? PHP의 개발자가 PHP는 프레임워크 없이 쓰는 것이 좋다라고 했는데 그 말이 제일 맞는 것 같다. PHP자체가 웹언어니 굳이 프레임워크 없이도 잘 쓸수 있고, 오히려 그럴때 고민을 덜하게 되는 것 같다. 익숙해 지면 물론 다르겠지만 처음 접하는 사람이 HTTP Header를 controller에서 $this->header를 사용할까 아니면 view에서 PHP 내장 header() 함수를 쓸까 고민하는 것 보다는 낫지 않을까? 물론 코딩량은 많아지겠지만...

이러한 이유때문에 다른 언어 기반인 Ruby On Rails(이하 Rails)나 Django로 바꿀 생각을 한번 해 보고 알아보기 시작했다. 사실 Perl 기반의 Catalyst나 함수형 언어 기반의 프레임워크도 생각 해 보았지만, 구할수 있는 자료가 너무 부족한 탓에 일단 Rails나 Django쪽으로 가닥을 잡았다. 일단 전에 Rails에 관련해서 살짝 본 적도 있고 해서 Rails를 선택할까 하다가도 약간은 생소한 Ruby 의 문법때문에 고민이 되었다. 그래서 일단은 Django에 대해서 한번 알아보기로 하였다. Python은 예전에 한번 본 적도 있고 해서 별 문제 없이 Django책 하나랑 Django 문서파일을 가지고 이것저것 해 보기 시작했다. 근데 생각보다 엄청 휼륭하다! 일단 내가 CakePHP에서 불편하다고 느낀 점은 하나도 발견되지 않았다. Django의 모델이 파이썬 코드 구현인 탓에 기존의 SQL을 Python코드로 옮기긴 해야 하겠지만 그건 아무런 문제가 아니었다. CakePHP처럼 Scaffolding기능이 있는 것도 아니었지만 전혀 상관없다. 그냥 할것은 모델을 만들고 간단하게 뷰 구현하고 템플릿좀 끄적여주면 페이지가 완성된다. 물론 아직 익숙하지 않아서 문서를 많이 찾아보지만, 소스 짜는것 자체가 전보다 훨씬 즐거워졌다. 확실히 CakePHP쓸때와는 다르게 쓸데없는 고민따위는 안해도 된다. 이후 Rails도 어떨까 궁금했는데 이것(https://docs.google.com/View?docid=dcn8282p_1hg4sr9)을 보니 뭐 Django보다 많이 좋을 것 같지는 않다.

하지만 Django도 아무런 문제가 없는건 아니다. 사실 Django의 모델에서 폼을 만드는 것은 사용이 그리 간단하지만은 않다. 예를들어 회원가입페이지는 User모델과 UserProfile모델에다 회원을 추가한다. 하지만 가입하기 위해 보여주는 폼(form)은 모델에서 바로 생성하기가 조금 어렵다. 물론 모델에서 생성 할 수 있지만 내가 원하는 대로 폼의 필드를 만드는 것은 사실 폼을 새로 만드는 것과 별 차이가 안난다. 아직 Django의 모든 기능을 알지는 못해서 그럴 수도 있는데 이부분은 좀 아쉽다.

간단히 요약하면 일단 PHP언어 자체와 프레임워크는 별로 어울리지 않는 것 같다. PHP6이 나오니 어떻게 변할지는 모르겠지만 일단 지금까지는 그렇다. 다른 프레임워크를 아직 많이 알지는 못하지만 Django정도면 웹에 있어서는 정말 좋은 프레임워크임에는 틀림없다. 한번 자신이 Python에 대해서 어느정도 알고있다면 웹프로그래밍을 할때 한번 Django에 도전해 보면 좋을 것 같다.
저작자 표시 비영리
Posted by CECRI
보통 웹으로 로그인 폼을 통해 로그인 기능을 구현 할 때 보통의 경우 비밀번호를 그냥 보내고 서버 상에서 검증하게 된다. 하지만 이러한 방법은 패킷만 캡쳐를 하면 비밀번호를 알아낼수 있어서 매우 위험하다. 따라서 다른 여러가지 방법을 통해 비밀번호를 평문(plain-text)로 보내지 않고 다른 방법을 거쳐서 보내게 된다. 그중 하나가 MD5 Hash를 이용한 digest인증 방법이다. 이에 관심이 생겨 위키(http://en.wikipedia.org/wiki/Digest_access_authentication)를 찾아보던 중 재미난 것을 몇개 발견하였다.

일단 HTTP 스킴이 제일 처음 디자인 된 곳은 유럽입자물리연구소인 CERN이다. 그리고 MD5에 대한 보안상 문제점을 제기하는 논문중에 조금 크리티컬 한 것이 우리나라사람이 제 1저자로 쓴 논문(http://eprint.iacr.org/2006/187.pdf)같다. 우왕 신기해라~
저작자 표시
Posted by CECRI

CakePHP 후기

Programming/Web 2011/01/12 23:30
일단 몇일동안 CakePHP를 써본 후기를 올린다. 아직 많이 사용 해 본것도 아니고 홈페이지를 다 만든것도 아니지만 일단 조금 아쉬운 점이 있어 올린다.

CakePHP는 유명한 웹 프레임워크인 RoR(Ruby on Rails)의 기능을 본따 php로 만든 것이다. 문제는 php자체가 루비와는 다르게 웹 언어로부터 출발하였고, 프레임워크를 염두하고 만든 것이 아니기 때문에 쓰다 보면 좋을 때도 있지만 좀 귀찮을때도 있다. 그냥 쌩으로 코딩할때는 별 고민없이 프로그래밍한걸 CakePHP내장 함수들을 써서 다듬으려니 꽤나 귀찮다. 특히 디비에 쿼리날릴때 제일 이런 느낌이 많이든다. 원래대로라면 MySQL의 내장함수들과 프로시져를 포함하게 쿼리를 날릴텐데 그걸 전부 php안에서 해야되서 제약이 많아졌다. MySQL의 강력한 기능을 못쓰는 기분. 

게다가 CakePHP만의 강력한 기능들은 ajax를 구현할때는 별로 또다른 강력한 기능을 하지 못한다. 원래 기본적으로 form의 어느 필드가 문제인지 알려주는 validate 기능도 ajax에서는 실제 폼으로 전송하는게 아니니까 내부에서 validate을 하고 결과 에러메세지를 데이터로 전송해야 한다. 물론 미리 validate하였기 때문에 save하는 함수에도 validate을 하지는 말라고 알려줘야 한다. 뭐 그래도 조금은 편하긴 하지만 생각했던것 만큼 엄청난 일을 줄여주거나 하지는 않는것 같다. 관련 기능이 있는 Helper를 쓰면 나을 것 같기도 한데, 기본으로 추가되어 있는게 아니기 때문에 무슨 Helper가 좋은지도 모르겠다. 

또한 다른 문제는 성능이다. 같은 기능을 생으로 구현했을때와 CakePHP를 썻을때 성능차이가 꽤나 많이 난다. 사용자가 매우 없는 상태라 원래는 누르면 바로바로 받아진 ajax데이터가 꽤나 오래건린다. 

하지만 좋은 점도 많다. 일단 마음에 든건 MVC패턴과 레이아웃 기능, 그리고 validate기능이다. 딱 이정도 기능만 있고 빠른 프레임워크가 있으면 많이 좋을 것 같다. 아마 Codeigniter 가 이런데 좋은 것 같은데 알아봐야겠다.


저작자 표시
Posted by CECRI
프로그래밍 언어는 크게 두가지 종류로 나뉜다. 그중 하나는 명령형 프로그래밍 언어(imperative programming language, http://en.wikipedia.org/wiki/Imperative_programming) 이고 다른 하나는 함수형 프로그래밍 언어(functional programming language, http://en.wikipedia.org/wiki/Functional_programming)이다. 사실 이것은 분류의 한가지 방법일뿐 객체지향을 중요하게 생각하는 사람이면 OOP/ Non OOP로 나눌 수도 있고, 이런 방식으로 나누면 stack을 이용하는 forth나 논리형 프로그램언어인 prolog는 자리가 애매해 지기도 한다. 하지만 내가 이러한 방식으로 프로그래밍 언어를 나눈 것은 이러한 분류방법이 컴퓨터 모델에 대한 가장 큰 두가지 방식과 일치하기 때문이다. 


컴퓨터는 무엇을 계산가능할까? 또 어떤 종류의 문제들을 빨리 계산할수 있을 것인가? 이러한 의문에 답해주는 것이 계산이론(Theory of computation, http://en.wikipedia.org/wiki/Computational_theory)이다. 이것은 논리학을 가지고 컴퓨터가 어느것을 계산할수 있는지와 없는지를 알려준다. 이 이론을 전개하는 방식은 여러가지가 있는데, 그중 대표적인 두가지 방식이 튜링머신(Turing Machine, http://en.wikipedia.org/wiki/Turing_machine)과 람다대수(Lambda calculus, http://en.wikipedia.org/wiki/Lambda_calculus) 이다. 


튜링머신은 앤런 튜링이라는 사람이 만든 컴퓨터의 모델로 기본적으로 무한한 메모리와 몇가지 명령어로 계산하는 컴퓨터의 수학적 모델이다. 너무 자세히 들어가면 복잡해 지니 기본적인 개념만 살펴보자. 기본적으로 튜링머신은 자신의 상태, 무한한 테이프, 다음에 읽을 테이프의 위치 그리고 입력과 상태에 따라서 다음 상태를 알려주는 상태표로 결정된다. 컴퓨터 구조에 익숙한 사람이라면 기본적인 폰 노이만 모델을 떠올릴 수 있을 것이다. 현대 컴퓨터로는 상태는 CPU의 register 값들, 테이프는 메모리, 다음에 읽을 위치는 PC, 상태전이표는 CPU명령어(어셈블리어 명령)에 대응한다. 이때 가장 중요한 특징은 순차적으고 메모리를 사용한다는 것이다. 이것은 명령형 프로그래밍 언어의 모델이된다. 즉, 메모리는 각각의 변수에 대응되고 순차적으로 상태를 바꾸는 것이 변수들의 값을 바꾸고 반복문과 조건문을 이용하는 것이 된다. 


그렇다면 람다대수는 어떻게 되는 것인가? 람다대수도 튜링머신과 완전히 동등하게 컴퓨터를 묘사한다. 하지만 람다대수에는 메모리나 상태같은 것이 없다. 대신 함수를 통해 그것을 나타낸다. 또한 반복문 대신 재귀호출을 통해 연속된 것을 표현한다. 또한 함수는 가장 기본적인 형태로 함수가 함수의 인자로 들어가는 것이 매우 자연스럽다. 이것들이 가장 큰 특징이자 다른 점이다. 자세한 것을 실제 프로그래밍을 통해 알아보도록 하자.


하지만 보통의 프로그래밍 언어에서 이러한 두가지 방법이 완전히 구분되지는 않는다. 명령형 프로그래밍 언어라고 하더라도 어느정도 함수형 언어의 기능을 가지고 있고 함수형 프로그래밍 언어라고 하더라도 어느정도는 멍령형의 특징을 가지게 된다. 특히나 우리가 사용하는 컴퓨터는 튜링머신에 기반을 둔 모델로 만들어졌기 때문에 함수형 프로그래밍언어도 실행될때의 모습은 순차적인 명령형 프로그램을 수 밖에 없다. 


다음부터는 Python과 Caml 프로그래밍 언어를 통해 두개의 다른 프로그래밍 언어들의 특징을 알아보도록 하자.
저작자 표시 비영리
Posted by CECRI
http://www.cgal.org/

C++ 기반의 계산기하 라이브러리. 전에 컴과 졸업논문 쓰면서 했던게 이쪽 관련된거라 그때 한번 찾아보고 잊고 있었다. 전반적으로는 C++로 아주 잘 짜여진 수학 라이브러리이다. 소스도 공개되어 있으니 한번 분석해 보면 큰 도움이 될듯.
저작자 표시
Posted by CECRI
안드로이드로 주소록을 받아오는 것을 해 보고 있다. 기본적으로 이름과 전화번호를 받아 오는것을 만들고 있다. 생각으로는 단체문자하는 어플을 만들고 싶어서 모바일로 등록되어 있는 것만을 가져오고 싶다. 책에서는 People클래스를 이용하는데 deprecated되었다네. 그래서 다른 방법을 찾아보다가 발견한 페이지. http://androiddevblog.blogspot.com/2010/02/query-contacts-data.html 그래서 따라서 해 보았다.
        Cursor contacts = managedQuery(ContactsContract.Contacts.CONTENT_URI, null, "HAS_PHONE_NUMBER=1", null, null);
        MatrixCursor cursor = new MatrixCursor(new String[] {"_id", "name", "phone_number"});        startManagingCursor(cursor);
        if (contacts.moveToFirst()) {
        	String name;
        	String contactId;
        	int nameColumn = contacts.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
         	int idColumn = contacts.getColumnIndex(ContactsContract.Contacts._ID);
        	do {
        		name = contacts.getString(nameColumn);
        		contactId = contacts.getString(idColumn);
        		Cursor phones = getContentResolver().query(
        				ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
        				null,
        				ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId + " AND " +
         				ContactsContract.CommonDataKinds.Phone.TYPE + "=" + ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE ,
        				null,
        				null);
        		if (phones.moveToNext()) {
        			String phoneNumber = phones
        			.getString(phones .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
    				cursor.addRow(new String[] {contactId, name, phoneNumber});
        		}
        		phones.close();
        	} while (contacts.moveToNext());
        }        contacts.close();
쿼리도 두 번 뿐이고 잘 된다. 왠지 조인으로 한번에 하면 될 쿼리를 나눠서 하느나 좀 신경쓰이긴 하지만. 근데 작업 도중 Contacts 를 통해 접근해야만 하는 줄 알았던 DISPLAY_NAME이 ContactsContract.CommonDataKinds.Phone.에도 있는것을 알았다. 음? 설마 하는 마음에 다음과 같이 해 보았다.


        Cursor cursor = managedQuery(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
         		new String[]{ContactsContract.CommonDataKinds.Phone._ID, ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
         			ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
        			ContactsContract.CommonDataKinds.Phone.NUMBER},
        			ContactsContract.CommonDataKinds.Phone.TYPE + "=" + ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE, null, null);
        startManagingCursor(cursor);

잘 된다... 결과도 똑같아... 난 결국 뭘한거지.. ㅠㅠ 알아서 조인해 주는듯 하다. 

업뎃했으면서 변경된 사항도 예제랑 곁들여서 친절히 설명해주면 좋을것을...
저작자 표시
Posted by CECRI

Iterators

Programming/C/C++ 2010/06/18 17:44
Boost Graph 라이브러리(BGL)와 STL을 사용하면서 느끼는건데...

정말 참 좋긴 한데..

정말 좋은데 ㅋㅋ

근데 사용하기가 쉽지많은 않다.

STL은 제공하는것만 사용하려면 쉬운데(typedef만 좀 해 주면) 

내가 만든 클래스도 iterator를 직접 제공하려고 하는데 이게 STL의 iterator랑 호환되게 하려면

typedef도 좀 해 줘야 하고 operator 오버로딩도 좀 해 줘야 하고

특히 copy같은 algorithm 헤더에 있는 녀석들이 사용하게 하려면

뭔가 추가할게 많다 ㅠㅠ

BGL은 사용하기는 좋은데 descriptor랑 iterator가 막 섞여서 다 까먹고 다시 보려니 

애먹고 있다. 근데 descriptor라는 발상은 좋은데 뭔가 직관적이지는 않다.

그래서 프로그램 짜다 보면 사용자층은 좀더 직관적으로 사용 할 수 있고 추상적인건 숨기게 하려니

코딩량이 좀 많아지는듯.

저작자 표시
Posted by CECRI

C++을 사용하다가 뭔가 불편하다 싶은것들은 대충 다 있다.


Delegate도 있고 Garbage Collector도 있고 근데 pointer도 있다. ㅎㅎ. Template도 있고.. 큭히나 C++0x에서 추가하기로 했다가 결국 못한 concept개념이 constraint라고 해서 들어가있다. 무려 다음과 같은게 가능

1.  bool isprime(int n)   

2.  {   

3.      if (n < 1 || (n & 1) == 0)   

4.      return false;   

5.      if (n > 3)   

6.      {   

7.      for (auto i = 3; i * i < n; i += 2)   

8.      {   

9.          if ((n % i) == 0)   

10.         return false;   

11.     }   

12.     }   

13.     return true;   

14. }   

15.   

16. template Foo(int N)   

17.     if (isprime(N))   

18. {   

19.     ...   

20. }   

21.   

22. Foo!(5)    // ok, 5 is prime   

23. Foo!(6)    // no match for Foo  

무려 컴파일타임에 되는것임 ㄷㄷㄷ

그러니까 그냥 할수 있는건 C++하고 마찬가지인데, 편하긴 더 편하다.

그러니까 pImpl같은 귀찮은 구현도 별로 필요 없고 Exception처리할때 객제자체가 왔다갔다 하는것도 안해도 되고 하여간 좋은듯

제일좋은건 C함수 그대로 쓸 수 있다. WINAPI같은거 그냥 쓸수 있음 ㅋㅋ

C++버리고 갈아탈만도 할듯..




저작자 표시
Posted by CECRI
C++의 템플릿 기능을 최대한 이용해서, 컴파일 시간에 작동되는 프로그램을 만드는 Template Meta Programming은 실행시간의 값 같은 것을 이용하지 않고, 컴파일 시간에 확정되는 개체처럼 이용한다. 이러한, 컴파일 시간에 다룰 수 있는 개체를 메타자료(metadata)라고 한다. 메타자료는 크게 형식메타자료(Type)와 비형식(Non-type) 메타자료로 나눌 수 있다. 비형식 메타자료는 컴파일 시간 상수값을 의미하고, 형식 메타자료는 컴파일 시간에 확정되는 클래스(class of struct)를 의미한다.

이런 컴파일 시간 개체들도 런타임의 값을 이용하는 함수처럼, 컴파일 시간에 확정되는 함수같은것이 있다. 이런 함수를 메타함수(metafunction)이라고 한다. 보통, boost의 MPL에서는 메타함수는 return값을 가지는 대신 메타함수<인자>::type을 반환값으로 쓴다. 다음과 같은 것이 메타함수의 예이다.

template<class T, class R, class X>
struct composit
{
    typedef typename T::template apply<R::template apply<X>::type >::type type;
}


메타함수는 인자(템플릿의 인자)로 주어진 클래스의 가능한 프로토콜(위의 예에서는 R이 template apply<X>를 가지고 있을것) 로 실행여부가 결정된다. 같은 프로토콜을 가지고 있으면 어떤 클래스라도 인자로 쓰일 수 있다. 즉 TMP의 다형성이 구현되는 원리이다. 이것은 비단 TMP만 그런것이 아니고, 모든 템플릿 기반의 함수들의 특징이다. boost의 graph라이브러리는 이런 특징을 정말 잘 이용하고 있다.

그러면 이제 Boost Type Traits 라이브러리에 대해 알아보자. 이 Type Traits 라이브러리는 표준STL에 있는 라이브러리와 비슷하지만, 한 클래스에 여러 정보를 담은 Blob(일종의 anti-pattern이다)를 없애고 훨씬 깔끔한 형태의 메타함수라는 점이 다르다. 자세한 내용은 http://www.boost.org/doc/libs/1_39_0/libs/type_traits/doc/html/index.html
이것을 보자.

저작자 표시
Posted by CECRI

C++의 또다른 매력 TMP


#include <iostream>
//TMP
template <bool cond, typename T1, typename T2> struct IF{};
template <typename T1, typename T2>
struct IF<false, T1, T2>{
 typedef T2 type;
};
template <typename T1, typename T2>
struct IF<true, T1, T2>{
 typedef T1 type;
};
template <typename T, typename U>
struct Typelist{
 typedef T hd;
 typedef U tl;
};
struct NullType{};
template<int n>
struct NUM{
 enum {val=n};
};
template<typename expr1, typename expr2>
struct PLUS{
 enum {val=expr1::val+expr2::val};
};
template<typename expr1, typename expr2>
struct MINUS{
 enum {val=expr1::val-expr2::val};
};
template<typename expr1, typename expr2>
struct MULT{
 enum {val=expr1::val*expr2::val};
};
template <typename exprlist>
struct MAX{
 enum {val=IF<(exprlist::hd::val > MAX<typename exprlist::tl>::val),
  typename exprlist::hd,
  MAX<typename exprlist::tl> >::type::val};
};
template<>
struct MAX<NullType>{
 enum {val=0};
};
int main(){
 std::cout <<
  PLUS<
   NUM<10>,
   MAX<
    Typelist<
     NUM<20>,
     Typelist<NUM<10>, NullType >
     >
    >
   >::val;
 return 0;
}

사실은 프로그래밍 원리의 nML숙제를 TMP로 구현한것.
저작자 표시
Posted by CECRI

보영이누나 나도 레문누나랑 같이 사줘요 초밥먹고 싶어 냠냠

-. 몇살 때 프로그래밍을 처음했나요?
초등학교 x학년 ㅋㅋ

-. 프로그래밍을 어떻게 하게 되었나요?
초등학교때 컴퓨터학원에서 대강 배웠지..

-. 무엇이 첫번째 언어입니까?
Visual Basic 5.0 ㅋㅋ

-. 프로그래밍을 시작한 이후로 어떤 언어들을 사용해봤습니까?
VB, C, Scheme, C++, JAVA, Scheme, Ruby약간, Python 약간, nML,

-. 첫 번째 직업적 실패는 무엇이었나요?
ㅋㅋ 뭐 전시회 준비하면서 mp3라이브러리를 만드는 도중, 설계 다 해놓고 시간 없어서 결국 포기 ㅠㅠ

근데 직업은 아님. ㅋㅋ

-. 지금 알고 있는 것을 과거에 알았더라도 프로그래밍을 시작했을까요?
뭘 아는지 모르겠음. 솔까말 나한테는 프로그래밍 자체보다 그에 관련된 이론들이 더 재밌어서. 계산이론이라든지 프로그래밍 언어론이라든지 뭐 구현은 사실 별다른 문제가 아니라고 생각. 하지만 디자인 패턴이나 이런거 공부하면서 직접 구현하는것도 재밌긴 함. ㅎㅎ

-. 이 직업을 하면서 배운 것들 중에 신참 개발자에게 말하고 싶은 게 있다면 무엇인가?
(그러니까 내가 왜 받은거지;;;;;;;;;바톤 준 페리누나 원망스럽다...........)
솔직히 개발자가 될것 같지는 않지만... 뭐 이 분야에 처음 발을 내 딛은 사람들에게 하고 싶은 말은 그냥 재밌게 끈기 있게 하라는거?



-. 프로그래밍했던 것 중에 가장 즐거웠던 것은?
이번 프로젝트과 꽤나 즐거울것 같은 느낌이 난다. ㅎㅎ. 사실 아직은 배워가는 과정이라... 뭘 직접 만드는것 보다 그러면서 배우는 과정이 더 재밌는듯.

-. 다음 바톤은?
여기 들어오시는 분들이 없어서.. 내가 먹어야지 냠냠.
Posted by CECRI
아직 잘은 모르겠지만...

뭐 레퍼런스를 통해 객체에 메세지를 날린다든지 이런 설정은 smalltalk와 꽤나 유사한것 같고...

아무데서나 클래스 선언을 추가할수 있다는 점도 꽤나 쓸모있을것 같고...

그리고 속성부분도 C++하고 JAVA도 잘 모르는 나한테는 꽤나 신선하게 다가왔다.

뭐 자연어처럼 쓸수 있게 하는 부분은 Perl하고도 비슷하긴 한데... 이런건 빠지는 추세라니...

코드블록도 좋은 부분이고...

PL관련으로 한번 본다면 꽤나 매력적인 언어같다.

인터프리터 언어긴 한데 꽤나 관심이 가네.. ㅎㅎ
Posted by CECRI
TAG Ruby

레일즈로 코딩하는걸 본 소감...

이것 좀 짱인듯 ㅋㅋ

DB쓰는데 SQL이 필요 없고

컨트롤러에서 작업 할것 진짜 뭐할건지 구현 하나도 없이 써놓기만 하면 알아서 되고

그것 보여주는건 그냥 뷰에서만 하면 되고

간단히 말하면

구현을 찾아볼 수가 없다...

진짜 신기한듯 ㅋㅋ


사용자 삽입 이미지


짤방은 레일즈 책..
Posted by CECRI

Dammit Emacs

Programming 2008/05/25 16:41

그래도 난 vi...

사용자 삽입 이미지

Posted by CECRI
오늘 현대대수학 첫 시간에 교수님이 일반적인 무협지의 이야기에 대해 약간 말을 해 주셨다. 사실 수학에서의 추상화의 힘 이런것을 말하던 부분이었던것 같다.

그중 기억나는부분을 있다.

 주인공은 정공 문파의 제자가 되서 숨쉬는법, 잠자는법 이런것을 가르침 받고 주인공의 라이벌인 원수의 아들은 사문의 제자가 되어 창쓰는법, 활쓰는법 이런것을 가르침을 받는다.

그리고 대련을 하는데, 처음에는 주인공이 계속 진다. 그러다가 어느날, 몸이 가벼워지고, 자신이 달라짐을 느낀 주인공은 원수의 아들을 통쾌히 때려 눕힌다.


내가 왜 프로그래밍 언어라는 제목을 달고 이런 이야기를 하느냐면, 프로그래밍 언어도 이와 똑같다고 생각하기 때문이다. 프로그래밍 언어만 다양하고 열심히 익힌 사람은 처음엔 대단할줄 몰라도, 결국 컴퓨터에 대한 이해 없이는 좋은 프로그램을 만들기는 힘들다. 사실 언어 자체를 잘하는것도 중요하지만, 그것은 프로그래밍을 얼마나 잘하느냐와 전혀 다른 문제다.

보통 프로그래밍을 한다고 하면, 요구조건에 맞춘 설계부터 시작한다. 설계를 한다면 보통 내부적인 구현인 자료구조와 객체가 가지고 있는 성질을 보존하기 위한 알고리즘들, 그리고 외부 인터페이스의 설계를 하게 될 것이다.
프로그래밍 언어는 여기서 어느 인터페이스를 가지냐에 따라 보통 달라진다. 이클립스처럼 사용자의 OS에 관계 없이 일관된 인터페이스를 가진다면, JAVA를 이용하고 특정OS나 인베디드 환경에서 돌아간다면 C나 C++을 사용하게 될것이다.

따라서 중요해지는 능력은 그 시스템에서 제일 효율적인 자료구조, 알고리즘, 객체관계들을 알맞은 프로그래밍 언어로 표현하는 능력인데, 사실 이것은 언어 자체를 얼마나 잘 아느냐보다는 그 시스템에 대해서 얼마나 잘 알고 있냐가 중요한 영향을 미친다.


사실 컴과 전공과목중에 프로그래밍을 직접 하는 과목을 그렇게 많지 않고, 프로그래밍 언어 자체를 배우는 수업은 거의 전무하다. 그 이유도 바로 이런것에서 나오지 않았을까 싶다.


Posted by CECRI
사실 C++에서 객체지향은 그렇게 까지 큰 부분을 차지하고 있지는 않다. 스캇 마이어스 형님의 EC++에서는 C++은 절차형 언어, 객체지향형 언어, 제네릭 프로그래밍, STL이라는 네가지 부분으로 나눌 수 있다고 한다. 사실 STL은 라이브러리일 뿐이지만, 그 자체만으로도 엄청난 성능을 자랑한다. 웬만한 알고리즘과 자료구조는 전부 있으니 STL을 잘 아는 사람이 짠 수치계산이나 통계같은것의 코드는 전부 STL만 쓰여서 그냥 STL코드라고 불러도 될정도니 그렇게 포함시킨것 같다.

C++에서 객체지향은 그것을 이루는 네가지 구성요소중 한가지에 지나지 않는다. 여기서 자바와의 차이점이 발생한다. 하지만 이로 인해 생기는 오해가 C++을 java보다 못하다고 생각하는것이다.

많은 사람들이 C++의 객체지향정도가 많이 낮다고 한다. 이것에 대해서는 나도 어느정도 동의하는 편이다. 하지만 이것을 가지고 C++을 깍아내리는건 바람직하지 못하다. 여러 라이브러리나 이런것이 비 객체지향적으로 설계되어 있지만 그 이유는, 어느 경우는 템플릿을 쓰는것이 재사용성이나 간결함을 객체지향을 쓰는것보다 훨씬 잘 구현할 수 있기 때문이다.

C++에서 자바의 Object같은것이 없는 이유는 그런것을 통해 클래스 계층구조를 만듬으로써 잃는 성능상의 이점이 얻는것보다 많다고 느꼈기 때문일 것이다. 사실 Object같은건 프레임워크에서 구현할수 있는 것이고(MFC의 CObject가 그렇다) 보통의 경우 그것을 쓰지 않아도 충분히 코드를 만들 수 있고, 필요한 경우에도 템플릿 같은것을 쓰는 경우가 더 효율적일때가 많다.

사실 객체지향을 배우기에는 C++은 별로 바람직하지 못하다. C++의 원래 목적은 뛰어난 프로그래머에게 강력한 툴을 제공하기 위한것이라고 한다. 사실 C++의 복잡한 문법과 템플릿의 능력같은것을 보면 그 말이 틀리지는 않은 것 같다. 처음 객체지향을 배우는 사람이 C++의 방대한 문법을 본다면 꽤나 암담할 것이다.

그리고 많은 사람들이 JAVA를 객체지향적이라고 하지만, 자바의 객체지향은 C++의 부분집합이라는 느낌이 강하다. 물론 레퍼런스나 가비지 컬렉팅 같은것은 C++과의 뚜렷한 차별성을 주지만, 기본형과 객체의 구분과(오토박싱이 있긴 하지만 그래도 다른것은 다른것이다) '.'연산자로 메쏘드에 접근하는것은 사실 완벽한 객체지향이라는 smalltalk에 비추어 보면 그 정도가 모자란다. 사실 자바가 쓰기가 편하고 간결한것은 부정할수 없는 사실이다. 하지만 그 이유가 객체지향을 완벽히 구현했기 때문이 아니라, 사용자에 맞추어 개발된 언어기 때문이라는것이 내 생각이다.

smalltalk, ObjectC같은 메세지 기반으로 객체지향을 구현한 언어들을 보면 놀랄만큼 유연하다. smalltalk는 객체지향이 언어에 완벽히 내제되어있다(C++처럼 C에 문법을 추가해서 구현한 객체지향과 다르다는 이야기이다). 레퍼런스는 어느 타입이나 가리키고 메쏘드 호출은 메세지를 보내는것으로 대신한다. 가상함수나 이런것으로 구현된 오버라이딩이 아니라 메세지 처리기만 바꾸는 방식이다. 하지만 별로 인기가 없는것은 그만한 메리트가 없다는 것이겠지.

사실 WIN32API도 메세지 기반으로 C에서 객체지향을 구현하기는 했다. 하지만 언어가 아닌 관계로 언어의 문법 대신, 여러가지 API함수들을 통해 객체지향을 구현한다. 따라서 그닥 쓰기 쉽지가 않다. 객체지향적이긴 하지만 쓰다 보면 MFC가 왜 나왔는지 알수 있다.

다시 C++로 돌아오면 C++에서는 객체지향을 강제하는것이 하나도 없다. 라이브러리가 특별히 객체를 요구하지도 않는다. 그냥 함수객체같은것은 함수 포인터면 된다. 하지만 이것이 다른 방향의 객체지향을 만든다. smalltalk가 기본형과 객체 구분없이 레퍼런스로 가리킨다면, C++은 객체를 아예 기본형처럼 만든다. 객체는 수치형이 될수도 있고, 그냥 우리가 아는 그냥 객체일수도 있고, 아니면 함수객체같은것 일수도 있다.

사실 C++이 완전히 이렇지는 않다. 객체형을 받을때는 const T&로 받고 기본형은 그냥 값에의한 호출로 받기 때문에 차이점이 아예 없는것은 아니다. 하지만 제네릭 알로리즘 같은것은 C++의 이런 부분을 남김없이 사용할수록 되어 있다. 대충 알고리즘에서 사용하는 연산자들만 지원하면 어느 타입이든 전부 된다.

JAVA에서는 이런것을 따라하기 위해 객체지향적인 방법을 사용한다. T Max<T implements Comparable>(T[]) 같은 식이다. 하지만 이런것에서 T는 레퍼런스로 한정되어 있다. 기본형은 오토박싱을 써야 하고, 이런 제네릭은 TMP같은것도 불가능하다. 구현 자체도 JAVA에서는 T에 대해 compare메쏘드를 호출하는 식으로 비교한다. C++에서는 >연산자이다. 연산자 오버로딩의 강력함이다. 결국 함수 호출이 되지만 기본형에서도 잘 작동하고 무엇보다도 이런것을 통해 가벼워진다. 이런 식으로 C++은 객체지향을 포기하지만 강력함을 포기하지는 않는다.

사실 C++은 사용하기 어렵다. C++찬양을 하던 나도 별로 쓰고 싶지 않은 경우가 많다. 메모리관리를 직접 해야 하는건 정말 성가시다. java에서는 별로 필요 없는 pimpl 관용구를 써야 할때도 많다. 하지만 그래도 자바에서는 느낄수 없는 STL이나 템플릿의 강력함, 연산자 오버로딩, 스택에 쌓이는 객체 등은 정말 색다른 매력이다. 특히 자바에서 펑펑 낭비해가면서 쓰던 메모리를 C++로 돌아오면 조심조심 쓰는 그런 이중적인 모습도 발견할때 마다 웃게 된다 ㅎㅎ. 뭔가 java에서는 인간적 느낌이 별로 안느껴 지는듯.
Posted by CECRI
<html>
<head>
<script type="text/javascript">
window.onbeforeunload = beforeUnload;

function beforeUnload(){
        return "Are you sure you want to leave?";
}
</script>
</head>
<body>
Please stay on this page!
</body>
</html>

-----------------------------------------------------------
좀 줄여서 쓰고 싶으면

window.onbeforeunload = function()
{
        return "Are you sure you want to leave?";
}
이렇게 써도 되요.


보통은 이렇게 쓰지만..
window.onbeforeunload = function() {
        return "Are you sure you want to leave?";
}
Posted by CECRI