BLT, blittable

BLT : block transfer
메모리의 내용을 옮기는 행위

<blittable>

Most data types have a common representation in both managed and
unmanaged memory and do not require special handling by the interop
marshaler. These types are called blittable types because they do not require conversion when they are passed between managed and unmanaged code.

대부분의 데이터 형식에는 관리되는 메모리와 관리되지 않는 메모리 모두에서 공통되는 표현이 있으므로, interop 마샬러에서
특별한 처리를 하지 않아도 됩니다. 이러한 형식은 관리 코드와 비관리 코드 사이에서 전달될 때 변환할 필요가 없으므로 blittable 형식이라고 합니다.

 

[book]Visual Basic.NET Class Design Handbook

비주얼 베이직 6.0에서 비주얼 베이직 닷넷(이하 비베닷넷)으로 옮기는 과정에서 참 많은 것이 장벽이었는데, 이런 것들 한 방에 해결해 준 책이 바로

Visual Basic .NET Class Design Handbook: Coding Effective Classes (Paperback)이다.

사용자 삽입 이미지
비베닷넷이 되면서 완전히 객체지향 프로그래밍 언어로 탈바꿈했다. 객체지향프로그래밍의 핵심은 그 무엇보다도 객체를 만들어내는 설계도 같은 클래스라고 할 수 있다. 책 제목에서도 알 수 있듯이 이 클래스를 어떻게 효과적으로 설계할 것인가를 자세히 다루고 있다.
참 맛있게 읽은 책이다.

During object-oriented analysis and design, we identify the most important objects in our system, and consider how they relate to each other. But during object-oriented programming, we don’t write ‘objects’; we define classes to represent the behavior and attributes of objects.
객체지향 분석과 설계를 하는 동안에, 우리는 우리 시스템 안의 가장 중요한 객체를 규명하고, 서로간에 어떻게 관계하는지를 고려한다. 그러나 객체지향 프로그래밍을 하는 동안에는 ‘객체들’을 작성하지 않는다. 다만 객체들의 행위와 속성을 대표하는 클래스를 정의한다.
(본문 중에서)

[web page]Computer Vision

computer vision에 대한 open source가 있다. 그 대표적인 것이 openCV(open source computer vision)이다.
openCV : http://opencv.willowgarage.com/wiki/

이를 C#, VB.Net, VC++, IronPython 등에서도 사용할 수 있도록 랩퍼를 만든 것이 있다.
EmguCV : http://www.emgu.com/wiki/index.php/Emgu_CV
OpenCVDotNet : http://code.google.com/p/opencvdotnet/
SharperCV : http://www.cs.ru.ac.za/research/groups/SharperCV/
Code Project : http://www.codeproject.com/KB/cs/Intel_OpenCV.aspx

훌륭한 소프트웨어 설계자

패턴을 활용한 리팩터링(Refactoring to Patterns)에 나은 말들

더 훌륭한 소프트웨어 설계자가 되려면, 훌륭한 소프트웨어의 설계가 어떻게 발전해왔는지 그 과정을 공부하는 것이 훌륭한 설계 자체를 공부하는 것보다 훨씬 중요하다. 그 발전 과정 속에 진짜 지혜가 숨어 있기 때문이다. -Joshua Kerievsky의 Refactoring to Patterns

부모에게서 물려받은 것을 진정으로 소유하려면, 그것을 얻는 과정을 처음부터 다시 반복해야 한다.-괴테
That which thy fathers have bequeathed to thee, earn it anew if thou wouldst possess it. – Goethe

[VBA]VBA에서 엑셀함수 사용하기

엑셀 함수는 VBA 함수보다 훨씬 다양한 분야에 많은 함수들을 보유하고 있다.
앞서 살펴본 것처럼, 삼각함수 분야에도 많은 역함수를 보유하고 있다. 더군다나 스프레드시트 프로그램으로서 당연히 갖추어야 하는 함수도 많이 보유하고 있다. 예를 들면 다음과 같다.

첫줄은 원주율을 참조한 것이고, 둘째줄은 코사인 역함수를 호출하여 사용한 것이다.
셋째줄은 워크시트 내의 특정범위를 설정한 것이며, 네째줄에서 이 범위에 대한 합을 엑셀함수를 이용하여 구했다.

또 다른 방법으로는 Evaluate 메소드를 사용하는 것이다.

[VB6, VBA]삼각함수의 역함수(ArcSin, ArcCos) 작성

앞서 기술한 것처럼, 비주얼베이직6.0과 VBA에는 삼각함수의 역함수인 ArcSin()과 ArcCos()이 없다. 대신 Atn()만 있다.
도움말을 보면 다음과 같이 작성하라고 안내하고 있다.

이대로 하면 분모가 0이 되는 경우에 대한 대책뿐만 아니라, x가 -1<=x<=1 범위를 벗어날 경우에 대한 대책이 없다.
특히, 부동소수계산을 하다보면 정확하게 -1 또는 1이 되지 않고, -1.0000000** 또는 1.000000**가 되는 경우가 발생한다. 이에 대한 대책이 필요하다.

FYI

ArcSin, ArcCos을 작성한 이유 : 태양기하학에서는 태양의 방위각과 고도를 계산하는 과정에서 삼각함수를 많이 사용한다. 1보다 작은 값들로 사칙연산을 하다보면, 부동소수가 정상 범위를 벗어나는 경우가 생긴다. 이런 오류를 사전에 방지하기 위해서 작성하였다.

태양의 고도를 계산하는 공식은 다음과 같다.

\sin h = \sin \delta \sin L + \cos \delta  \cos L \cos H

따라서,

h = \arcsin \left( \sin \delta \sin L + \cos \delta \cos L \cos H \right)

  • h (태양의 고도) : -90° ~ +90°
  • δ (태양의 적위) : -23.5° ~ +23.5°
  • L (위도) : -90° ~ +90° (남극 ~ 북극)
  • H (시각) : -180° ~ +180° (00시는 -180°, 06시는 -90°, 12시는 0°, 18시는 +90°, 24시는 +180°)

태양 방위각 \phi 은 다음과 같은 공식으로 구한다.

\cos \phi = \frac{\sin h \sin L - \sin \delta}{\cos h \cos L}

 \phi =\arccos \left( \frac{\sin h \sin L - \sin \delta}{\cos h \cos L} \right)

삼각함수 비교

삼각함수 비교

설명 Excel VBA VB6 VB.NET 비고
sin 사인함수 Sin Sin Sin Sin
cos 코사인함수 Cos Cos Cos Cos
tan 탄젠트함수 Tan Tan Tan Tan
arcsin 사인역함수 Asin Asin
arccos 코사인역함수 Acos Acos
arctan 탄젠트역함수 AtanAtan2 Atn Atn AtanAtan2
sinh 하이퍼볼릭사인함수 Sinh Sinh
cosh 하이퍼볼릭코사인함수 Cosh Cosh
tanh 하이퍼볼릭탄젠트함수 Tanh Tanh
arcsinh 하이퍼볼릭사인역함수 Asinh
arccosh 하이퍼볼릭코사인역함수 Acosh
arctanh 하이퍼볼릭탄젠트역함수 Atanh

이상에서 보듯 VB6와 VBA로 프로그래밍을 하고자 하면, 삼각함수의 역함수를 작성해야 한다.
만약 VBA에서 새로 역함수를 작성하지 않고, 엑셀함수를 사용하고자 한다면 다음과 같이 하면 된다.