2015년 10월 8일 목요일

C#의 Serialize 이용하여 손쉽게 class instance 파일로 저장하기


serialize(직렬화)는 파일 저장시 할 때 혹은 네트워크 전송시 주로 많이 사용된다.

WCF에서도 XML형식으로 직렬화하여 전송한다. remote function call 시의 파라미터값이나 콜백 데이터 등을 직렬화 해서 전송하게 되는데 물론 사용자 정의 클래스타입이라면 Contract를 정의해 주어야 하지만 직렬화는 자동으로 진행되므로 매우 편하다.


BinaryWriter를 사용하여 MVC 패턴 형식으로 프로그램 구조를 설계 시 매우 손쉽게 현재 상태를 저장하고 불러오는 형태로 사용 할 수 있다.

다만 직렬화시 귀찮은 작업을 하지 않으려면 몇가지를 고려하여 설계 하는 것이 좋다.

1. 데이터 클래스와 비즈니스 로직은 구분하여 클래스로 작성한다.

  이벤트나 델리게이트의 파라미터나 Argument의      serialize 하기 애매한 객체가 담기는 경우가 있는데  UI Control이나 Winform 객체가 Runtime시에 할당된다면 귀찮은 작업이 필요 해 질 수 있다. 
 코드가 간단한 경우에는 애트리뷰트 설정만하면 해당 필드를 제외 할 수 있지만 복잡한 상속 계층을 가지거나 이미 프레임워크 수준으로 구축되어있다면 모든 코드를 확인해가면서 작업을 해야 할 수도 있다.


2. 직렬화할 데이터를 UI 로직과 분리한다.
 예를 들자면 Winform 의 객체들은 기본적으로  Serializable하지 않다. xml class를 통해서 UI자체도 직렬화 할 수 있긴하지만 그다지 추천할만하지 않다. UI의 구성요소의 갱신은 데이터 클래스와 비즈니스 로직의 산출물을 통해서 갱신되도록 설계하면
 데이터 클래스만 변경한다면 언제든지 변경된 데이터에 맞게 UI를 유지 할 수 있다.

결국은 MVC 패턴대로 설계하면 매우 손쉽게 데이터만 직렬화 역직렬화 할 수 있다는것이다.

우선 Serialize / DeSerialize method 작성































요런 식으로 미리 만들어 두자.

사용은 이런식으로 사용

















ISerializable interface를 구현해도 된다.













GetObjectData는 Serialize, Data(SerializeInfo info, StreamingContext context)는 Deserialize를 구현한다.

Mac AppNap 설정

AppNap 이란?
Mac OSX 10.9 부터 실행 중인 앱 중에 다른 앱에 의해 가려지거나 사용하지 않는 것으로 판단되는 앱의 Message 처리를 OS 레벨에서 매우 낮은 우선순위로 하여 배터리 소모를 제한하는 기능이다.

물론 백그라운드 스트리밍이나 다운로드 중인 경우 OSX에서 눈치 채서 제한을 걸지 않지만
정상적인 백그라운드 동작에서도 AppNap기능이 활성화되어 문제가 되는 경우가 있다.

해당 기능이 동작하는지는 Activity Monitor 앱을 통해 확인 할 수 있다.



















defaults 라는 환경 변수 값 비슷한 걸 설정해 주면 기능을 끄거나 켤 수 있다.


Xamarin 을 이용하여 코드를 작성해 보자


우선 설정값을 읽어오는 코드

















defaults read 도메인 키값

형식으로 사용하면되고, NSGlobalDomain은 모든 앱을 설정하기 위한 도메인이다.

NSAppSleepDisabled 키가 AppNap설정을 위한 키의 이름이다.

해당 키값을 읽어오면 AppNap 설정이 활성화 되어있다면 0, 비활성화 상태이면 1을 반환한다.















AppNap 설정 수정하기..

활성화 시키기 위해서는 해당 키를 지우면 된다. delete
비활성화 하기 위해서는 해당 키를 write 하고 값은 -bool YES로 지정한다.


수정된 내용을 적용하기 위해서는 재부팅이 필요하다.





Mac 슬립모드 방지 팁

맥을 사용하다보면 슬립모드에 들어가면 곤란한 경우가 종종 있다.
장시간 구동되는 프로그램이라던지..

대부분 프로그램 상에서 슬립모드에 빠지는 것을 방지하지만 해당 기능이 활성화 되어 있지 않다면
맥에 자체적으로 내장된 기본 유틸인 caffeinate 을 사용하면 된다.

아래 페이지에 방문하면 Man Page에 방문하여 상세한 옵션을 확인 할 수 있다.

https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man8/caffeinate.8.html

Xamarin 프로그램 상에서 간단하게 슬립방지를 하려면 Background Thread를 만들어서
Process를 하나 돌리면 간단하다.

Process가 살아있는 동안은 계속해서 슬립모드 방지 동작한다.
프로그램 시작시 Process 시작 후 종료시 Process를 종료해 주면 간단.






2015년 8월 7일 금요일

c# Webbrowser Control에서 CSS 웹사이트 적용하기

회사에서 진행 중인 프로젝트에서 c# Application에서 Webbrowser Control을 사용하여 클라우드 서버와 연동하는 프로젝트를 진행하게 되었다.

c# 에서 기본 제공하는 Webbrowser Control은 기본이기도 하지만 사용하기도 편한 장점이 있지만
큰 단점이 하나 있는데 CSS style sheet 가 제대로 적용이 되지 않는다는 점이다.


왼쪽이 익스플로러 화면이며, 오른쪽이 Webbrowser Control을 이용한 테스트 프로그램이다.

예상하는 문제 원인으로는 아마도 해당 컨트롤이 IE7으로 인식 되기 때문인데 실제로 윈도우에 IE8이상이 설치되어 있다고 해도 무조건 IE7 엔진으로 구동되기 때문에 스타일 시트가 제대로 적용되지 않는 것 같다.

이에대한 대책으로 .net Wrapping 된 Webkit 엔진 라이브러리를 사용하였으나 또다른 문제가 발생하였는데. Flash나 HTML5가 완전히 구현되지 않았다는 점이다.

HTML5 Video 부분 스펙이 완전히 결정된지 얼마 되지 않았고. 대부분의 Wrapper library들이 마지막업데이트가 된지 제법 되었기 때문에 대응이 되지 않은 것으로 보인다.

늘 그렇듯이 구글검색을 통하면 왠만한 솔루션이 있기에 이를 해결하기 위한 방법을 찾아보자.



구글링으로 찾아보니 FEATURE_BROWSER_EMULATION 이라는 것을 설정해서 해당 응용프로그램의 Webbrowser를 이용하면 된다고 한다.

         public Form1()
        {
            SetBrowserFeatureControl();
            InitializeComponent();
        }
       
        private static void SetBrowserFeatureControl()
        {
            // http://msdn.microsoft.com/en-us/library/ee330720(v=vs.85).aspx
            // WebBrowser Feature Control settings are per-process
            var fileName = System.IO.Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName);
            // make the control is not running inside Visual Studio Designer
            if (String.Compare(fileName, "devenv.exe", true) == 0 || String.Compare(fileName, "XDesProc.exe", true) == 0)
                return;
            SetBrowserFeatureControlKey("FEATURE_BROWSER_EMULATION", fileName, GetBrowserEmulationMode());
        }

        private static void SetBrowserFeatureControlKey(string feature, string appName, uint value)
        {
            using (var key = Registry.CurrentUser.CreateSubKey(
                String.Concat(@"Software\Microsoft\Internet Explorer\Main\FeatureControl\", feature),
                RegistryKeyPermissionCheck.ReadWriteSubTree))
            {
                key.SetValue(appName, (UInt32)value, RegistryValueKind.DWord);
            }
        }
        private static UInt32 GetBrowserEmulationMode()
        {
            int browserVersion = 7;
            using (var ieKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer",
                RegistryKeyPermissionCheck.ReadSubTree,
                System.Security.AccessControl.RegistryRights.QueryValues))
            {
                var version = ieKey.GetValue("svcVersion");
                if (null == version)
                {
                    version = ieKey.GetValue("Version");
                    if (null == version)
                        throw new ApplicationException("Microsoft Internet Explorer is required!");
                }
                int.TryParse(version.ToString().Split('.')[0], out browserVersion);
            }
            // Internet Explorer 10. Webpages containing standards-based !DOCTYPE directives are displayed in IE10 Standards mode. Default value for Internet Explorer 10.
            UInt32 mode = 10000;
            switch (browserVersion)
            {
                case 7:
                    // Webpages containing standards-based !DOCTYPE directives are displayed in IE7 Standards mode. Default value for applications hosting the WebBrowser Control.
                    mode = 7000;
                    break;
                case 8:
                    // Webpages containing standards-based !DOCTYPE directives are displayed in IE8 mode. Default value for Internet Explorer 8
                    mode = 8000;
                    break;
                case 9:
                    // Internet Explorer 9. Webpages containing standards-based !DOCTYPE directives are displayed in IE9 mode. Default value for Internet Explorer 9.
                    mode = 9000;
                    break;
                default:
                    // use IE10 mode by default
                    break;
            }
            return mode;
        }


주요 코드를 복사해 보았다.

생성자에 보면 SetBrowserFeatureControl 메소드가 call 되는 것을 볼 수 있는데 이부분이
FEATURE_BROWSER_EMULATION  를 셋팅해주는 곳이다.

하나하나 소스코드를 따라 가면서 확인해 보면

현재 실행중인 프로세스 이름을 가져오는 부분이 있는데 이부분은 비쥬얼 스튜디오내에서 실행 중인 경우 , 즉 아마도 디자이너에서 보여질때 생성되기 때문에 예외처리인듯 하며.

그다음 줄인 아래에 기록한 메소드를 보자. 
SetBrowserFeatureControlKey("FEATURE_BROWSER_EMULATION", fileName, GetBrowserEmulationMode());

해당 메소드를 보면 우선 GetBrowserEmulationMode() 메소드에서 현재 브라우져의 버전을 알아오고 브라우져 버전에 맞는 에뮬레이션 모드값을 가져온다. 메소드 내용을 살펴보면 알겠지만
우선 레지스트리에서 svcVersion 이나 Version 값을 찾아서 해당 버전에 대응되는 모드값을 반환한다.

그 모드 값을 인자로 하여 이제 FEATURE_BROWSER_EMULATION을 셋팅하는데, 결국은 레지스트리에 기록하는 것이다.

SetBrowserFeatureControlKey() 메소드의 내용을 확인하면 아래의 레지스트리에
Software\Microsoft\Internet Explorer\Main\FeatureControl\

FEATURE_BROWSER_EMULATION 이라는 서브키를 생성하고 거기에 현재 실행중인 파일이름, 아까 구한 브라우져 모드값을 등록한다.

실제로 등록이 잘되는지 실행해서 확인해 보자.



레지스트리 에디터로 확인해 보니 현재 실행중인 프로그램으로 모드값이 기록되어있다.

이제 프로그램으로 적용이 되는지 확인해 보자.






이전과 다르게 정상적으로 렌더링이 된 것을 확인 할 수 있다.




pi2steam 개발 완료

Metro App 부분의 추가 삭제 구현을 제대로 해야 하는데, 퇴근 후 짬짬히 하려고 하다보니 귀찮아져서
적당히 대충 만들어서 마무리 했다.
등록 할 수 있는 게임은 총 6개 이고.. 이정도면 뭐 쓰는데는 지장이 없겠지 ㅋ

개발한 프로그램을 올려본다.

.net framework 4.0 이 설치 되어있어야 한다.




최초에 미등록된 타일을 클릭하면 추가할 게임 이름을 입력받고 등록되면 우측하단에 이름이 표기된다. 표기된 타일을 클릭하면 게임이 실행된다.




ssh 라이브러리 변경

sharpssh 를 사용해서 코드 작성하여 테스트 진행하니 ssh 커넥션에서 실패한다.

정확한 이유는 알수 없지만 ssh2 를 지원하지 않는 듯하다.

그래서 ssh.net 라이브러리를 사용하기로 하였다.


사이트에가서 dll 라이브러리를 다운받자.

프로젝트에 dll 파일을 레퍼런스에 추가하고

namespace를 추가해주자.





이제 접속하는 코드를 작성해 보자.

  public void StartSshStream(App app)
  {
    using (var ssh = new SshClient(m_Config.m_ConnectionSetup.RasberryIP, m_Config.m_ConnectionSetup.Account, m_Config.m_ConnectionSetup.Password))
   {
    ssh.Connect();
                string strCommand = string.Format("java -jar {0}/limelight.jar stream {1} -{2} -{3} -app {4}"
                    ,m_Config.m_ConnectionSetup.LimeLightPath
                    ,m_Config.m_ConnectionSetup.HostIP
                    ,m_Config.m_StreamOption.ScreenResolution.ToString().Replace("RES_","")
                    ,m_Config.m_StreamOption.ScreenFramerate.ToString().Replace("FPS_","") +"fps"
                    ,app.AppName);
                var cmd = ssh.CreateCommand(strCommand);   //  very long list
    var asynch = cmd.BeginExecute(delegate(IAsyncResult ar)
    {
     Console.WriteLine("Finished.");
    }, null);
    var reader = new StreamReader(cmd.OutputStream);
    while (!asynch.IsCompleted)
    {
     var result = reader.ReadToEnd();
     if (string.IsNullOrEmpty(result))
      continue;
     Console.Write(result);
    }
    cmd.EndExecute(asynch);
                ssh.Disconnect();
   }
        }

sshClient 객체를 생성해주고 생성자의 파라미터 값은 ip,id, password string 값을 사용하였다.
다른 생성자 코드는 chm 파일로 제공되는 api 도움말을 참고하자.

connect()로 연결하고 ssh Command를 생성해서 비동기로 실행한다.

동기 방식과 비동기 방식 두가지로 실행 할 수 있지만 Application이 뿌리는 로그나 텍스트를 Catch 해서 처리하기 위해서는 비동기 방식이 적절하다.

Command의 result가 해당 커맨트로 인해 뿌려주는 결과를 string 형식으로 뿌려준다.

streamreader를 하나 생성해서 cmd의 outputstream를 받아 read 할 수 있다.

Command가 종료되면 disconnect 를 해준다.

동일한 방식으로 실행 커맨드 코드와 PC와  pair하는 코드를 작성하였다.

이제 UI 부분의 앱 추가 삭제하는 로직만 작성하면 된다.




UI 화면 구성

Winform Metro ui 라이브러리를 이용하여 기본 UI 레이아웃을 구성하였다




게임 / 프로그램 목록 UI





연결 설정





화면 설정




내일은 sharpssh 를 이용하여 ssh 연결 하는 방법을 진행해 보자




개발용 라이브러리 선정

c# base 로 개발 할 예정이지만 ssh 통신을 위하여 별도의 라이브러리를 사용할 예정이다.

라이브러리는 sharpssh 이며 BSD 라이센스이므로 큰 제약 없이 개발에 사용 할 수 있을듯 하다.

어짜피 스팀 런처가 있기때문에 화려한 화면 구성은 필요하지 않기 때문에 윈폼 기반으로 간단하게 핵심 기능만 구현 할 예정이다. Winform Mordern UI Metro Framework 이라는게 있다고 하니 한번 사용해볼 예정이다.

아래 사이트에 가서 sharpssh의 바이너리 라이브러리 파일과 소스코드, 샘플 프로젝트 파일을 구할 수 있다.

그럼 모던 UI 라이브러리를 다운받아 보자.(이놈은 MIT 라이센스이다.)


git 서버에 가서 소스코드를 다운로드 받을 수 있다.

다운받은 소스를 visual studio로 열어보면 데모 프로젝트 까지 포함되어 있다.

빌드해 보니 처음 빌드 부터 오류가 있다.

기본 소스 부터 오타가 있는듯 하다.



따옴표 부터 수정했다.

수정후 빌드는 되지만 실행하려고 하면 또 다른 에러가 발생한다.
데모 프로젝트가 아닌 라이브러리단에서 에러가 난다. 이건 수정해야 된다.



win32 메세지를 잡아서 처리하는 핸들러 부분인데
windowbuttonlist에서 최대화 관련 버튼을 찾아서 보통때는 숫자1을 최대화 상태일때는 2를 표기하는거랜다. 이게 뭐하는데 필요한지 모르겠지만 그냥 버튼 표기되는 텍스트를 1로 표기하느냐 아니면 2로 하느냐 차이다.

windowsbuttonlist가 근데 null 이다. 뭐에 쓰는건진 모르겠지만 중요한건 아닌건 같으니, 버튼텍스트 안바꿔도 뭐 별거 있겠냐 싶어 주석 처리했다.



수정하고 나서 데모 프로젝트가 잘 실행된다.

이제 빌드된 라이브러리를 가지고 프로그램을 만들어보자.




라즈베리파이2 스팀 원클릭 접속용 프로트엔드 프로그램 개발

지난 포스트에서 라즈베리 파이2와 limelight 프로젝터를 이용하여 스팀 게임 실행을 진행해 보았다.

그러나 라즈베리 파이에서 xwindow 가 띄워져있다면 ssh를 사용하거나 x를 띄우지 않고 실행하여야 한다.

물론 처음 라즈베리가 부팅될때 스크립트에 포함 시킬 수도 있겠지만
그렇게 되면 전용으로 밖에 사용할 수 없고 호스트가 되는 피씨가 켜져 있지 않다면 또 문제가 있다.

그래서 간단하게 라즈베리 파이로 ssh 접속하여 미리 설정해둔 명령어를 실행하여
프로그램을 실행하는 간단한 프로그램을 하나 만들어 보려한다.

라즈베리 파이의 IP와 계정아이디 비밀번호 게임이름, 그리고 화면 설정값을 별도의 설정창에서
지정해 두고 게임별로 리스트로 관리하여 버튼 원클릭으로 미리 설정해둔 게임을 실행 하도록
만들어보자.

만들기 전에 만들고자 하는 핵심적인 요구 사항에 대해서 정리하자.



요구사항
1. 라즈베리 파이의 ip와 계정명 비밀번호는 별도로 설정하여 저장하고 한번 설정하면 추가 입력하지 않도록 한다.

2. 각 게임별로 설정 리스트를 만들어 원하는 게임을 각각 클릭하여 원하는 게임을 실행 할 수 있고 사용자는 해당 게임별 리스트를 삭제 또는 추가 할 수 있다.

3. 화면 설정 부분은 해상도와 fps 등 각종 설정을 미리 저장하여 별도로 입력 하지 않도록 한다.




windows 10 IoT Core App 개발 환경 구축

windows 10 IoT Core App을 개발하기 위해서는 visual studio 2015 버전이 필요합니다.

아래 사이트의 안내에 따라 설치를 진행합니다.


우선 VisualStudio 2015 RC 버전을 위 사이트를 통해서 다운로드 및 설치 합니다.

설치 완료 후

아래의 사이트에 가서 맨아래까지 스크롤을 하면  Other Downloads 라는 항목이 있습니다.



해당 항목중 2가지를 다운로드하여 설치 합니다.

설치가 끝나면
이전 포스트에서 다운로드 받은 라즈베리파이 이미지 압축파일에 있던
zip 파일안의 msi 파일을 설치합니다.

라즈베리파이를 랜에 물리고, 개발할 PC와 같은 네트워크 내에 물립니다.
(공유기나 같은 내부네트워크에 연결합니다.)

설치가 끝나면 라즈베라파이용 Windows 10 Iot Core App 개발을 위한 환경 설정이 끝납니다.

다음 포스팅은 설치한 Visual studio를 통해 앱 개발을 진행합니다.




windows 10 IoT Core for pi2 설치하기

pi2 판매시 부터 홍보하던 windows 10 pre-release 버전이 공개되었다.

Microsoft Connect를 통해 공개 테스트 하고 있는 이 버전을 다운로드 받아 실행해보자.

마이크로소프트는 아래와 같이 Step by Step 설명서를 제공한다.


위 사이트 내용을 따라 하나하나 진행하여 보자.


설치전 필수 사항
1.Windows 10 Insider Preview - Virtual Machine 이 아닌 진짜 물리적으로 설치 필요
2.라즈베리파이2
3. 5v micro usb 전원 : 적어도 1A이상 전류 공급 가능하여야함
4. 8기가이상 sd카드 - class10 이상
5. HDMI 케이블 (화면 볼라면)
6. RJ45 인터넷 케이블


SD카드에 windows10 IoT Core Insider Pre-Release 버전 넣기
윈도우10 빌드버전 10069 이상이 설치되어있어야 합니다.

마이크로소프트의 베타 릴리즈는 Microsoft Connect를 통해서 이루어집니다.

위 사이트에 접속하여 사이트에 로그인하고 (기존 마이크로소프트 계정 , 핫메일이라던지..)

windows embedded pre-release program을 찾아서 참여를 합니다.
EULA를 잘 읽어 보시고 동의하여 참여합니다.

다운로드 메뉴를 통하여 pi2 버전을 다운로드 합니다.





5월 30일 기준 가장 최근 날짜 이미지를 다운로드 합니다.

다운받은 Windows_IoT_Core_RPI2_BUILD.zip 파일의 압축을 풀고
Flash.ffu 파일을 접근하기 편한 폴더로 복사합니다.

sd카드를 sd카드 리더기에 넣고 PC에 연결합니다.

관리자 권한으로 CommandPrompt를 실행합니다.



diskpart를 입력하고 list disk 를 입력하여 sd카드 의 디스크 이름 (숫자)를 확인합니다.
exit를 눌러 diskpart를 종료합니다.

flash.ffu파일을 복사한 경로로 폴더를 이동하고 아래 명령어를 입력합니다.
N부분은 위에서 확인한 디스크의 번호로 변경합니다.

dism.exe /Apply-Image /ImageFile:flash.ffu /ApplyDrive:\\.\PhysicalDriveN /SkipPlatformCheck




SD카드 이미지가 만들어졌습니다.


라즈베리파이에 sd 카드를 넣고 hdmi케이블을 연결하고, 랜선을 연결하고 전원을 연결합니다.

처음 실행시 몇분 정도가 소요됩니다.

조금 더 기다리면 설치되어있는 기본앱이 실행됩니다.




이제 설치된 기본 앱과 같은 앱을 VisualStudio를 통해서 개발하여 배포할 수 있습니다.




테스트앱 개발은 다음 포스팅에서 이어집니다. 





라즈베리파이로 스팀 게임하기

인터넷 검색 중 라즈베리 파이2를 이용하여 엔비디아 쉴드 게임 스트리밍 서비스를 이용한
게임 스트리밍이 가능하다고 하여 테스트 진행하였다.
상세 방법은 아래 동영상을 참고 한다.

호환되는 그래픽 카드는 지포스 600 시리즈 이후 부터 지원되며, 660M 인가 670M 부터 지원된다.
비공식 꼼수로 650M도 되긴한다.(650M은 고해상도시 좀 느리기 때문에 출력 해상도는 720p 정도로 낮추면 할만하다.)

원래는 NVIDIA 쉴드 태블릿 용으로 만든것이지만 벌써 오픈소스 진영에서 호환 프로그램이 나와서
다운받아 구동하기만 하면 스트리밍을 통해 게임을 할 수 있다.

일단 라즈베리 파이2는 데비안이 설치된 상태여야 한다.

직접 키보드 마우스 연결하고 파이2에서 직접 진행 할 수도 있지만 링크 복사 붙여넣기는 SSH 로 하는게 더 편하다.    직접하면 x- window 가 실행중에는 실행이 불가능하다고 에러 메세지가 뜬다.


위의 사이트에 가서 libopus.so 파일과 limelight.jar 파일의 링크를 복사한다.



wget http://다운받을 파일 인터넷 URL
을 타이핑 하면 직접 라즈베리 파이에서 직접 다운받을 수 있다.

so 파일과 jar 파일 둘 다 다운로드 한다.



다운받은 파일을 아래 명령을 입력하여 스트리밍을 할 메인 피씨와 페어링 시킨다.

java -jar limelight.jar pair 호스트피씨아이피

위 명령을 입력하면 핀번호가 뜨는데 호스트 피씨에서 핀번호 입력 창이 팝업되면 입력해 준다.



페어링이 완료되었다고 메세지가 나오면

게임을 실행해 보자



호스트 피씨에 게임을 자동 검색하면 설치된 게임 목록이 나오는데 이 목록에 등록된 게임을 라즈베리에서 실행 할 수 있다.

본인은 Bioshock Infinite 를 실행하여보았다.

java -jar limelight.jar stream 호스트아이피  -1080 -30fps -app 게임이름

-1080은 해상도이므로 720p로 구동하려면 -720으로 수정한다.

등록된 게임 이름중에 띄어쓰기가 포함되어 있다면
게임이름에 따옴표를 앞뒤에 붙여준다

예를 들면
-app 'Bioshock Infinite'

이렇게 입력하면 된다.



입력하면 화면에 메인피씨의 게임화면이 스트리밍으로 나타난다.

720p에 30fps 기준으로 구동상 렉이 느껴지지 않고 빠르게 동작한다.

엔비디아 프로그램에 게임 자동 검색 말고 사용자가 직접 프로그램도 등록 할 수 있는데
굳이 게임이 아니더라도 지정하면 원격 접속 처럼도 사용가능하다.

스팀 계정이 있다면 스팀을 등록하여 Big Picture 모드로 실행하면 게임 콘솔 처럼 사용 할 수 있다.




I2C 테스트

이번에는 I2C 통신을 이용한 LSM303DLHC 센서 데이터 Read 예제이다.
중력가속도센서와 마그네틱 센서라고한다.

어짜피 Raspberry Pi용 소스 가지고 2버전에서 되는지 확인하는 수준이지만
소스 잘 살펴보면 다른 센서나 IC에서도 사용하기에 무리가 없으리라.

메인 Processor 말고는 변한게 없으니 당연히 잘되겠지만 그래도 확인은 해야하니
한번 해보자.

bcm2835.c와 bcm2835.h 파일을 해당 폴더로 복사하자.
물론 1.39버전 것을 사용하여야 한다.

이것도 역시 LSM303.c 파일의 Header 파일 경로를 따옴표로하여 수정하여준다.



그리고나서 make

그리고 실행
sudo ./LSM303



A가 붙은 값은 가속도이고 M이 붙은값은 마그네틱이다.

역시 I2C 설정법은 첨부한 소스파일을 참고하면된다.

그말인 즉 라즈베리파이1 의 라이브러리인 bcm2835 라이브러리만 최신버전으로 교체하면
기존 소스가 정삭적으로 동작한다는 말이다.




특별할것은 없지만 그래도 돈주고 산 악세사리인데 테스트는 해봐야 하지 않겠는가?