WPF에서 INotifyPropertyChanged 귀차니즘 해결

WPF의  MVVM 구조는 멋지다. GUI 개발에서 glue code를 많이 제거해준다.

특히 Model 의 변화가 자동으로 View 에 반영되는 구조는 매우 유용하다.

다만, 모델의 프로퍼티가 변경 되면 propertyChanged를 이용해서 변경된 사실을 통보해줘야 한다.

요게 은근히 귀찮다.

public class Person : INotifyPropertyChanged
{
    string givenNames;
    public string GivenNames
    {
        get { return givenNames; }
        set
        {
            if (value != givenNames)
            {
                givenNames = value;
                OnPropertyChanged("GivenNames");
            }
        }
    }
}

위 코드처럼 프로퍼티를 일일이 만들어 줘야 하고, set 프로퍼티 안에서 일일이 OnPropertyChanged()를 호출해 줘야 한다. 하나 두개면 상관없지만 많으면 코드도 길어지고 개 귀찮..

하지만 역시 해결책은 있다!

https://github.com/Fody/PropertyChanged

이거 하나면 해결 끝~

ps. fody 라이브러리는 저거 말고도 엄청 다양한 플러그인이 있다

Advertisements

ARMCC 에서 Warning Disable 시키기

mbed 잘 쓰고 있다가 자꾸 서버가 다운되고 느려지고 해서 고민끝에 mbed를 탈출 하기로 마음먹고 KAIL uVision으로 이사 작업을 진행했다.

진행하는 도중 Eigen 라이브러리를 ARMCC에서 빌드해보니

routine is both “inline” and “noinline”

위 경고가 엄청 많이 뜬다. 사실 저 경고는 다른 컴파일러에서도 발생하는데 Eigen의 DisableStupidWarnings.h 파일에서 컴파일러 지시문을 이용해서 없애고 있을 뿐이다.

ARMCC는 저 경고가 제거되지 않고 계속 나와서 없애는 법을 찾아보았다.

#pragma diag_suppress 2751

위 지시문을 지정해주면 2751번 Warning이 무시된다. 비슷한 지시문으로는

#pragma diag_error 2751

위 지시문을 지정해지면 2751번 Warning이 Error로 격상되서 컴파일 오류를 발생시킨다.

참고로 MSVC에서의 경고문 제거 지시문은 아래와 같다

#pragma warning( disable : 4100 )

참고자료
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0348bk/CIHECIAD.html

PyCharm으로 원격지 파이썬 개발하기

PyCharm에서 가장 멋진 기능중에 하나는 원격 서버에서 실행하고 디버깅 할 수 있는 기능이다. 그 뿐만 아니라 원격지 서버에 있는 파이썬의 모든 라이브러리 정보를 로컬로 가져와서 코딩시에 자동완성이나 라이브러리 정보등을 볼수도 있다. 이를 통해서 파이썬기반 ROS 프로그래밍을 하는 방법을 살펴보자

원격지 파이썬 인터프린터 설정하기

스크린샷 2016-04-08 오후 10.40.27

우선 원격지에 있는 파이썬 인터프린터를 PyCharm에 등록해야 한다.

Preference > Project Interpreter > 오른쪽 상단에 있는 톱니바퀴 > Add Remote

아래와 같은 창이 뜨는데 자신의 원격지 서버 정보를 정확하게 입력하고 OK를 누르면 원격지 서버에 접속해서 PyCharm Helper를 전송하고 라이브러리 정보를 다운 받아서 파싱을 진행하는 과정을 거친다.

스크린샷 2016-04-08 오후 10.43.30.png

문제는 대부분의 필요한 파이썬 라이브러리 정보를 분석하지만 ROS 파이썬 라이브러리는 분석하지 않는다. 사용자가 직접 ROS 파이썬 라이브러리 위치를 등록해줘서 PyCharm이 ROS 파이썬 라이브러리도 인식할 수 있도록 해줘야 한다.

Preference > Project Interpreter > 오른쪽 상단에 있는 톱니바귀 > More…

리스트 목록 중에 방금 자신이 등록한 원격지 인터프린터가 있을 것이다. 해당 인터프린터를 선택한 다음, 아래 아이콘을 클릭한다.

스크린샷 2016-04-08 오후 10.49.27.png

그러면 원격지 서버에 어떤 디렉토리에 있는 파이썬 라이브러리를 분석할지 리스트가 나오는데 여기에다가 사용자가 직접 ROS 파이선 라이브러리들이 위치한 디렉토리를 추가해 주도록 한다.

스크린샷 2016-04-08 오후 10.50.20.png

원격지 서버에 배포하기

이번에는 로컬에서 코딩한 파일을 원격지 서버에 배포하는 방법을 살펴보자. 프로젝트를 하나 만들어서 새로운 파일에 적당히 소스를 코딩하자. 그리고 아래 메뉴로 들어간다.

Tools > Deployment > Configuration…

왼쪽 상단에 있는 + 아이콘을 눌러서 새로운 서버를 추가한다. SFTP를 이용하면 SSH를 이용하기 때문에 편하다. 서버 주소와 계정, 비밀번호를 정확하게 입력하고, Root path 정보는 / 라고만 입력한다.

그리고 나서 상단에 있는 Mappings 탭을 눌른다. Local Path는 로컬에 소스가 있는 위치를 지정하고 Deployment path on server는 원격지에 파일을 저장할 위치를 지정한다. 적당한 위치를 지정해준다. 그리고 OK를 누르고 창을 빠져나온다.

스크린샷 2016-04-08 오후 11.01.45.png

Tools > Deployment > Automatic Upload

위 기능을 활성화 해놓으면 파일 수정후 저장시 자동으로 파일을 원격지 서버에 업로드 해준다.

원격지 서버에서 실행하기

Run > Edit Configurations…

위 메뉴에 들어가서 왼쪽 상단에 있는 + 버튼을 누른다. 종류는 Python을 선택한다. Name은 적당히 적어준다. Script 에는 해당 프로젝트의 엔트리 포인트가 되는 파일명을 적어준다. Working Directory에는 소스가 있는 로컬 디렉토리를 지정해준다. OK를 누르고 나오면 된다.

환경변수 추가해주기

이렇게 하면 대부분의 파이선 개발에는 문제가 없다. 그런데 ROS 프로그램 개발시에는 제대로 동작하지 않는다. 이는 환경 변수가 제대로 설정되지 않아서 그런것인데, 이를 해결하기 위한 깔끔한 방법을 아직 찾지 못했다. 대신 아래와 같은 코드를 엔트리 포인트에 추가해주면 ROS 파이썬 프로그램을 동작시킬 수는 있다. 아래 내용을 컴퓨터에 따라서 전부 다르므로 자신의 환경 변수를 참고해서 적절하게 입력해야 한다.

os.environ['PKG_CONFIG_PATH'] = "/home/torooc/catkin_ws/devel/lib/pkgconfig:/home/torooc/catkin_ws/devel/lib/arm-linux-gnueabihf/pkgconfig:/opt/ros/jade/lib/pkgconfig:/opt/ros/jade/lib/arm-linux-gnueabihf/pkgconfig"
os.environ['ROS_DISTRO'] = "jade"
os.environ['ROS_PACKAGE_PATH'] = "/home/torooc/catkin_ws/src:/opt/ros/jade/share:/opt/ros/jade/stacks"
os.environ['ROS_ETC_DIR'] = "/opt/ros/jade/etc/ros"
os.environ['ROS_ROOT'] = "/opt/ros/jade/share/ros"
os.environ['ROS_MASTER_URI'] = "http://localhost:11311"

IntelliJ 첫 삽질기

오류) 메이븐 기반 프로젝트를 Tomcat으로 띄울려고 Run을 누르면 log4j 라이브러리를 찾을 수 없다고 에러가 난다

java: package org.apache.log4j does not exist

해결책) 이 오류는 IntelliJ에서 자동으로 만드는 xxx.iml 파일 내용중에 log4j 의 scope가 RUNTIME으로 되어 있어서 그렇다.

<orderEntry type="library" scope="RUNTIME" name="Maven: log4j:log4j:1.2.14" level="project" />

scope=”RUNTIME”을 지워준다

WFP XmlParserException 에러

인터넷에서 받은 예제 소스를 빌드하려고 하니 아래와 같은 에러 발생

A first chance exception of type ‘System.Windows.Markup.XamlParseException’ occurred in PresentationFramework.dll

Additional information: ‘connectionId 설정에서 예외가 throw되었습니다.’ 줄 번호 ‘6’ 및 줄 위치 ‘5’

인터넷에 보니 다양한 원인이 있다고 하는데 내 경우는 아래와 같이 해서 해결했다.

살펴보니, 솔루션안에 있는 특정 프로젝트가 x86으로 빌드되게 되어 있고, 그 프로젝트를 참조 하는 프로젝트는 Any CPU라서 그렇다.

프로젝트 Properties > Build > Platform Target 을 Any CPU 에서 x86으로 변경하고 다시 리빌드하니 해결됨

… 그나저나 이 이슈에서 VS의 에러 메세지는 아무런 도움이 안되네 -_-;;

관련 링크

ARMCC 에서 C++ / C Mix 하기

간단한건데 고생해서 ㅠ_ㅠ

1. c 에서 c++ 함수를 부르기.. 객체 부르기는 실패..

[c file]

int main() {
   entry_for_cpp();
}

[c++ file]

extern "C" int entry_for_cpp(void)
{
}

2. c++ 에서 c 함수 부르기..
(주) c파일은 header 파일을 만들지 않는다

[c++ file]

extern "C" void Set_Timer3_PWM1(int value);
   void RealHardware::SetMotor(int motor, int value) {
   Set_Timer3_PWM1(value);
}

[c file]

void Set_Timer3_PWM1(int value)
{
}