IdeA thinKING
May 21, 2013
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).
흑흑...
Labels:
IE,
Javascript
January 23, 2012
오리지널 레고 마인드스톰 부활 프로젝트
아... 이 사이트 너무 놀리는거 같아서 스킨 새 단장하고 글 하나. 참 스킨은 www.plaintxt.org 비슷하게 만들어 봤습니다.
약 12년전에 산 레고 마인드스톰이 있어서 애들한테 어떻게 굴러가게 만드는지 보여주려고 하니 여러가지가 걸리더군요. 일단 박스에 딸려온 소프트웨어는 Windows7에선 안 돌아가고 집에 있는 랩탑엔 씨리얼포트가 없고... 씨리얼포트... 정말 오랫만에 들어보는군요.
예전에 한번 써봤던 NQC로 코딩은 하면 될것 같은데 씨리얼포트는 달리 방법이 없어서 일단 아마존에서 어댑터를 하나 구입했습니다. 어댑터 도착 후 테스트해보니 씨리얼포트는 정상적으로 인식하더군요. 감동... ㅜㅜ Brix Command Center (BCC)라는 GUI도 있어서 설치해서 사용해보니 한 2%정도 편해지더군요. 이렇게되니 얼마전 쌍둥이들이 잃어버린 터치센서 하나가 무척 아쉬워지네요.
애들은 레고 시티 시리즈를 주로 가지고 노는데 나중에 자동문이나 회전목마같은거나 만들어줘야겠네요.
약 12년전에 산 레고 마인드스톰이 있어서 애들한테 어떻게 굴러가게 만드는지 보여주려고 하니 여러가지가 걸리더군요. 일단 박스에 딸려온 소프트웨어는 Windows7에선 안 돌아가고 집에 있는 랩탑엔 씨리얼포트가 없고... 씨리얼포트... 정말 오랫만에 들어보는군요.
예전에 한번 써봤던 NQC로 코딩은 하면 될것 같은데 씨리얼포트는 달리 방법이 없어서 일단 아마존에서 어댑터를 하나 구입했습니다. 어댑터 도착 후 테스트해보니 씨리얼포트는 정상적으로 인식하더군요. 감동... ㅜㅜ Brix Command Center (BCC)라는 GUI도 있어서 설치해서 사용해보니 한 2%정도 편해지더군요. 이렇게되니 얼마전 쌍둥이들이 잃어버린 터치센서 하나가 무척 아쉬워지네요.
애들은 레고 시티 시리즈를 주로 가지고 노는데 나중에 자동문이나 회전목마같은거나 만들어줘야겠네요.
January 6, 2011
Blogger.com으로 이전했습니다.
근 1년반만에 쓰는 포스팅인데 블로그 이전 메일이군요. ㅎㅎ
워드프레스 호스팅을 사용하고 있었는데 바꿨습니다. 사용한 방법은
워드프레스 호스팅을 사용하고 있었는데 바꿨습니다. 사용한 방법은
- 워드프레스 관리 페이지에서 export 메뉴로 xml 파일 다운로드
- 이미지 파일의 링크들을 찾아 피카사 앨범에 업로드 (이미지 파일은 10개 이하라 일일이 손으로 피카사 앨범으로 옮겨주었습니다.)
- 1번에서 백업했던 xml 파일에서 이미지 파일 링크들을 피카사 링크로 변경
- http://wordpress2blogger.appspot.com/ 를 사용하여 블로거 export 파일로 변경
- 블로거 관리 페이지에서 import
끝.
이미지 외 일반 파일들은 모두 무시하였습니다. ㅎㅎ
October 12, 2009
arraysizeof macro
다음 macro는 array의 length를 구하는 것인데 해석이 되시나요?
...
안되신 분들을 위한 설명입니다. ;)
위 코드는 다음 두가지 사실만 알고 있다면 (비교적) 쉽게 이해됩니다.
sizeof는 function call syntax에 대해서도 동작하며 그 function의 return type에 대해 동작한다.
array type의 reference를 리턴하는 method의 signature는 다음과 같다.
이를 바탕으로 arraysizeof를 만들려면 char(&)[N]을 리턴하는 method를 만들면 되죠. 여기서 N은 array의 length.
위 함수는 T(&)[N]을 parameter로 받아 char(&)[N]을 리턴합니다. 물론 T(&)[N] parameter는 이 template method의 implicit instantiation이 동작하도록 하기 위해 필요합니다. 마지막으로 sizeof는 method body가 필요없으므로...
끝.
참고로 이런 코드가 필요한 이유는 널리 쓰이는 "sizeof(array) / sizeof(*array)" macro가 다음과 같은 경우 compile error없이 오동작하기 때문입니다.
이 코드에서 array는 pointer와 같이 취급되어 sizeof(array)는 sizeof(int*)가 됩니다.
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*)가 됩니다.
Labels:
c++,
Programming language,
sizeof
September 25, 2009
Java generic in return context
아래 코드를 보시고 1, 2번 라인중에 어디서 에러가 날 지를 찾아보세요.
네, 2번 라인입니다.
그럼 다음 코드는?
네, 1번입니다. 잘 이해가 되질 않아 사내 메일링 리스트에 물어보니
이랍니다. 즉 T 타입이 아직 결정되지 않은 상태라 D와 T는 compatible한 타입이 아닌거죠.
강제로 casting을 해서 컴파일이 되게 만들면 그 코드는 runtime error (ClassCastException)를 발생하게 됩니다. 다음 코드를 보세요. 즉 이런 방법으론 도저히 type-safe한 코드를 작성할 수 없습니다.
이 같은 상황을 방지하기 위해 1번 라인에서 에러를 내 주는 것이죠.
코딩 가이드라인을 만들어 보자면 "method의 parameter로 사용되지 않는 type variable을 사용하면 안된다"입니다. 다음과 같은 경우는 parameter로도 사용되고 있으므로 문제가 없는 경우들입니다.
사실... 아직도 잘 모르겠어요. Java generic. =(
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. =(
Labels:
generic,
java,
Programming language
Subscribe to:
Posts (Atom)

