May 21, 2013

Complete Electronics Self-Teaching Guide


http://www.amazon.com/dp/1118217322

저의 눈높이에 딱 맞는 책이네요. 전기 전자 회로 잘 모르고 Arduino 시작하는 분들에게 추천합니다.

May 10, 2013

The Arduino Starter Kit



http://arduino.cc/en/Main/ArduinoStarterKit

Arduino로 뭘 좀 해볼까해서 구입한 스타터 킷인데 쓸만합니다. 저처럼 전기회로 잘 모르지만 Arduino 시작하는 분들에게 추천.
아직은 킷에 들어있는 매뉴얼 따라하고 있습니다. 집에 있는 레고 마인드스톰이랑 잘 붙여서 이런거 만들어보는게 현재 목표.

http://blog.arduino.cc/2008/10/08/arduway-and-arduino2lego/

February 8, 2012

'undefined' is null or not an object


아 IE...

'undefined' is null or not an object

Javascript 테스트 코드가 위 에러를 내면서 실행되질 않아서 삽질 좀 하다 찾아보니...

Look for any array of properties that has a trailing , (comma).

흑흑...

January 23, 2012

오리지널 레고 마인드스톰 부활 프로젝트

아... 이 사이트 너무 놀리는거 같아서 스킨 새 단장하고 글 하나. 참 스킨은 www.plaintxt.org 비슷하게 만들어 봤습니다.

약 12년전에 산 레고 마인드스톰이 있어서 애들한테 어떻게 굴러가게 만드는지 보여주려고 하니 여러가지가 걸리더군요. 일단 박스에 딸려온 소프트웨어는 Windows7에선 안 돌아가고 집에 있는 랩탑엔 씨리얼포트가 없고... 씨리얼포트... 정말 오랫만에 들어보는군요.

예전에 한번 써봤던 NQC로 코딩은 하면 될것 같은데 씨리얼포트는 달리 방법이 없어서 일단 아마존에서 어댑터를 하나 구입했습니다. 어댑터 도착 후 테스트해보니 씨리얼포트는 정상적으로 인식하더군요. 감동... ㅜㅜ  Brix Command Center (BCC)라는 GUI도 있어서 설치해서 사용해보니 한 2%정도 편해지더군요. 이렇게되니 얼마전 쌍둥이들이 잃어버린 터치센서 하나가 무척 아쉬워지네요.

애들은 레고 시티 시리즈를 주로 가지고 노는데 나중에 자동문이나 회전목마같은거나 만들어줘야겠네요.

January 6, 2011

Blogger.com으로 이전했습니다.

근 1년반만에 쓰는 포스팅인데 블로그 이전 메일이군요. ㅎㅎ
워드프레스 호스팅을 사용하고 있었는데 바꿨습니다. 사용한 방법은

  1. 워드프레스 관리 페이지에서 export 메뉴로 xml 파일 다운로드
  2. 이미지 파일의 링크들을 찾아 피카사 앨범에 업로드 (이미지 파일은 10개 이하라 일일이 손으로 피카사 앨범으로 옮겨주었습니다.)
  3. 1번에서 백업했던 xml 파일에서 이미지 파일 링크들을 피카사 링크로 변경
  4. http://wordpress2blogger.appspot.com/ 를 사용하여 블로거 export 파일로 변경
  5. 블로거 관리 페이지에서 import
끝.

이미지 외 일반 파일들은 모두 무시하였습니다. ㅎㅎ

October 12, 2009

arraysizeof macro

다음 macro는 array의 length를 구하는 것인데 해석이 되시나요?
template <typename T, size_t N>
char (&Helper(T (&array)[N]))[N];
#define arraysize(array) (sizeof(Helper(array)))

...

안되신 분들을 위한 설명입니다. ;)

위 코드는 다음 두가지 사실만 알고 있다면 (비교적) 쉽게 이해됩니다.

sizeof는 function call syntax에 대해서도 동작하며 그 function의 return type에 대해 동작한다.
int foo() { return int(); }
...
sizeof(foo()) == sizeof(int)

array type의 reference를 리턴하는 method의 signature는 다음과 같다.
char (&bar)[10]() { ... }

이를 바탕으로 arraysizeof를 만들려면 char(&)[N]을 리턴하는 method를 만들면 되죠. 여기서 N은 array의 length.
template <typename T, size_t N>
char (&Helper(T (&array)[N]))[N] {
...
}

위 함수는 T(&)[N]을 parameter로 받아 char(&)[N]을 리턴합니다. 물론 T(&)[N] parameter는 이 template method의 implicit instantiation이 동작하도록 하기 위해 필요합니다. 마지막으로 sizeof는 method body가 필요없으므로...
template <typename T, size_t N>
char (&Helper(T (&array)[N]))[N];

끝.

참고로 이런 코드가 필요한 이유는 널리 쓰이는 "sizeof(array) / sizeof(*array)" macro가 다음과 같은 경우 compile error없이 오동작하기 때문입니다.
void foo(int array[]) {
int size = sizeof(array);
}

이 코드에서 array는 pointer와 같이 취급되어 sizeof(array)는 sizeof(int*)가 됩니다.

September 25, 2009

Java generic in return context

아래 코드를 보시고 1, 2번 라인중에 어디서 에러가 날 지를 찾아보세요.
interface B {
void doB();
}
class D implements B {
public void doB() {}
}
interface H {
B getB();
}
class HImpl implements H {
public B getB() {
return new D();  // 1)
}
}
...
H h = new HImpl();
D d = h.getB(); // 2)

네, 2번 라인입니다.

그럼 다음 코드는?

interface B1 {
void doB1();
}
interface B2 {
void doB2();
}
class D implements B1, B2 {
public void doB1() {}
public void doB2() {}
}
interface H {
<T extends B1 & B2> T getB();
}
class HImpl implements H {
public <T extends B1 & B2> T getB() {
return new D();  // 1)
}
}
...
H h = new HImpl();
D d = h.getB(); // 2)

네, 1번입니다. 잘 이해가 되질 않아 사내 메일링 리스트에 물어보니
I think you're seeing and interpreting it as "this method can return anything that implements both interfaces". What it's actually saying is "the caller is going to tell you a specific class that implements both interfaces, and you must return one of those".

이랍니다. 즉 T 타입이 아직 결정되지 않은 상태라 D와 T는 compatible한 타입이 아닌거죠.

강제로 casting을 해서 컴파일이 되게 만들면 그 코드는 runtime error (ClassCastException)를 발생하게 됩니다. 다음 코드를 보세요. 즉 이런 방법으론 도저히 type-safe한 코드를 작성할 수 없습니다.

class D2 implements B1, B2 {
public void doB1() {}
public void doB2() {}
}
...
D2 d = h.getB(); // ClassCastException!!

이 같은 상황을 방지하기 위해 1번 라인에서 에러를 내 주는 것이죠.

코딩 가이드라인을 만들어 보자면 "method의 parameter로 사용되지 않는 type variable을 사용하면 안된다"입니다. 다음과 같은 경우는 parameter로도 사용되고 있으므로 문제가  없는 경우들입니다.

<T> T makeInstance(Class<T> cls) { return cls.newInstance(); }
...
<T extends Comparable<? super T>> T min(T a, T b) {
return a.compareTo(b) < 1 ? a : b;
}
위의 예제 코드같은 경우 아래와 같은 방법으로 type-safe하게 작성될 수 있습니다.
interface B1 {
void doB1();
}
interface B2 {
void doB2();
}
class D implements B1, B2 {
public void doB1() {}
public void doB2() {}
}
interface H  <T extends B1, B2> {
T getB();
}
class HImpl implements H<D> {
public D getB() {
return new D();  // 1)
}
}
...
H<D> h = new HImpl();
D d = h.getB(); // 2)

사실... 아직도 잘 모르겠어요. Java generic. =(