iOS2016. 12. 12. 10:57


Crash Log 콘솔에서 분석하기



크래시 발생 시 크래시데이터 저장위치(iTunes 동기화하면 저장됨)

Mac OS X: ~/Library/Logs/CrashReporter/MobileDevice/<DEVICE_NAME>


Windows XP: C:\Documents and Settings\<USERNAME>\Application Data\Apple Computer\Logs\CrashReporter\MobileDevice\<DEVICE_NAME>


Windows Vista or 7: C:\Users\<USERNAME>\AppData\Roaming\Apple Computer\Logs\CrashReporter\MobileDevice\<DEVICE_NAME>



아카이브파일은 Devices메뉴에서 Archives탭에서 해당 앱의 Show in Finder로 이동하면 찾을 수 있다.

아카이브에서 dSYM파일과 .app파일을 추출하여 크래시 로그와 동일한 폴더에 위치시킨다.


그러고 콘솔에서 아래와 같이 입력한다.

atos -arch armv6 -o 앱이름.app/앱이름 메모리주소


)

iyosam-ui-MacBook-Pro:Crash leeyosam$ atos -arch armv7 -o MobileApp-iPad.app/MobileApp-iPad 0x26000 [엔터키입력]

-[DSVCResultSearchViewController monthButtonTouchesUpInside:] (in MobileApp-iPad) (DSVCResultSearchViewController.m:241)

Posted by 삼스
HTML52016. 10. 6. 14:12


http://www.joshmorony.com/a-simple-guide-to-navigation-in-ionic-2/



Ionic1이나 Angular1 백그라운드가 다면 URL, state등으로 라우팅을 Ionic2에서도 사용은 가능하다 하지만 많은 주의가 필요하므로 권장하지 않는다.

Ionic2는 View를 push/pop하는 네비게이션 스택으로 운영된다.


이를 구현하는 방법을 배우기 전에 어떻게 동작하는지에 대해 먼저 이해해보자.


Push/Pop


root page가 고양이 그림이 그려진 종이가 테이블에 올려져 있다고 상상해보자.

이제 개그림이 그려진 종이를 올려보자. 그러면 개그림이 제일 위에 있게 된다. 그리고 고양이는 여전히 개그림 아래에 놓여져 있게 된다.

이번에 소그림이 그려진 종이를 올려보자. 소그림이 제일 위에 있고 고양이과 개그림도 여전히 놓여져 있다.

이제 개그림을 보려면 쌓여진 종이의 맨위 그림을 버리면 된다. 이어서 고양이그림을 보려면 한번더 맨위의 그림을 버리면 된다.

히스토리를 관리하는 아주 편리한 네비게이션방안이고 차일드뷰가 많은 경우 이해하기 쉽다. 하지만 항상 그런것은 아니다. 어떤 경우는 바로 이전페이지가 아니라 다른 페이지로 이동하고자 할 경우도 발생하기 마련이다(로그인 페이지에서 메인페이지로 이동하는경우).

이 경우 우린느 root page를 변경할 수 있다. 

위 예에서 소그림을 root page로 할 수 있다.


언제 push하고 언제 root page로 해야 하나?


현재뷰의 차일드로 전환하고자 하는 경우 또는 새로운 뷰에서 이전뷰로 돌아오기를 원한다면 push를 해야한다.

현재뷰의 차일드가 아니거나 애플리케이션의 다른 섹션으로의 이동이라면 root page를 변경해야 한다.

root page와 root component는 다르다. root component(보통 app.component.ts)가 root page를 정의한다. 


Ionic2 네비게이션 기초


NavController를 import해야 한다.


import { NavController } from 'ionic-angular';


그리고 생성자에서 inject해야 한다.


@Component ({

  templateUrl: 'home.html',

})

export clas MyPage {

  constructor(public navCtrl: NavController) {


  }

}


NavController의 레퍼런스가 생기고 클래스내 어디에서든지 사용이 가능하다. 이제 어떻게 push/pop을 하는지 보자


페이지를 push하려면 


this.navCtrl.push(SecondPage);


앞에서 inject한 navCtrl로 push하였다. 이렇게 하려면 SecondPage가 import되어야 한다.


import { SecondPage } from '../second-page/second-page';


이제 코드내에서 push를 호출하면 새로운 페이지가 표시될것이고 nav bar에 자동으로 백버튼이 생성이 될것이다.

pop을 언제 할것인지 고민하지 말라. 백버튼을 누르면 알어서 pop해줄것이다.


수동으로 이전 페이지로 이동하고자 한다면 명시적으로 pop을 호출한다.


this.navCtrl.pop();


이번엔 root page를 변경한는 방법이다. app.ts에 rootPage를 정의하였을 것이다.


rootPage: any = MyPage;


root component의 rootPage변수에 root page를 셋팅할것이다. root page를 변경하려면 NavController의 setRoot함수를 호출하면 그만이다.


this.navCtrl.setRoot(SecondPage);



Ionic2에서 페이지간 데이터 전송


모바일애플리케이션에서는 보통 페이지간의 데이터를 전달할 방법이 필요하다. Ionic2에서는 NavParams로 가능하다. push로 페이지 호출할때 파라메터를 생성하여 전달하는 방법이 있다. 이 방법은 setRoot시에도 동일하게 적용된다.


this.navCtrl.push(SecondPage, { thing1: data1, thing2: data2});


추가 파라메터가 더해진것 말고 이전과 사용법이 동일하다. 호출되는 페이지에서는 NavParams를 생성자에서 inject해야 한다.


import { Component } from '@angular/core';

import { NavController, NavParams } from 'ionic-angular';


@Component ({ templateUrl: 'second-page.html'})

export class SecondPage {

  constructor(public navCtrl: NavController, public navParams: NavParams) {


  }

}


이제 파라메터에 접근하려면 아래와 같이 하면 된다.


this.navParams.get('things');


Posted by 삼스
Linux2015. 9. 15. 13:20


http://docs.gstreamer.com/display/GstSDK/Installing+the+SDK


GstreamerSDK는 리눅스배포판별로 바이너리 패키지셋을 제공한다. 배포판 중에 Ubuntu에 대한 자세항 설명을 기술할거다.

소스코드를 다운로드하고 직접 빌드해서 환경을 설정할 수 도 있다.


다운로드 및 SDK 설치


1. Ubuntu 12.04(Precise Pangolin) 설치

2. gstreamer-sdk.list를 apt source list에 추가

SDK의 repository정보를 apt source list에 추가해주어야 한다.

다운로드 후 다음 명령으로 추가한다.

sudo cp gstreamer-sdk.list /etc/apt/sources.list.d/

3. GPG key추가 및 레포지트리 리프레시

이어서 apt repository의 GPG key가 추가되어야 하고 목록이 리프레시 되어야 한다.

wget -q -O - http://www.freedesktop.org/software/gstreamer-sdk/sdk.gpg | sudo apt-key add -

sudo apt-get update

4. SDK 설치

이제 새 레포지트리가 활성화되었다. 아래 명령으로 SDK를 설치하면 된다.

sudo apt-get install gstreamer-sdk-dev


개발환경 설정


빌드시 컴파일러는 하이브러리드를 반드시 특정 위치에 있어야 한다.  시스템에 설치된 Gstreamer와의 충돌을 방지하기 위해 비표준 위치(/opt/gstreamer-sdk)에 설치 된다.  쉘스크립트인 gst-sdk-shell은 SDK로 빌드하기 위한 필요한 환경변수들을 설정해준다.

/opt/gstreamer-sdk/bin/gst-sdk-shell

한가지더 필요한 개발환경은 gcc compiler와 text editor이다. SDK로 앱 코드를 빌드할 때 gcc command에 아래 내용을 반드시 추가해 주어야 한다.

'pkg-config --cflags --libs gstreamer-0.10'

다른 gstreamer library를 사용하고 있다면 예를 들어 video 라이브러리 같은... gstreamer-0.10뒤에 추가해주어야 한다.

'pkg-config --cflags --libs gstreamer-0.10 gstreamer-video-0.10'

빌드 시 libtool이 필요한 경우 즉 automake/autoconf를 사용하는 경우라면 configure 스크립트를 gst-sdk-shell환경으로부터 실행해야 한다.

SDK경로를 포함시킬 수 있는 방법이 있는데 그렇게 하면 gst-sdk-shell로부터 실행할 필요가 없다. gcc옵션에 다음과 같이 추가하면 된다.

-Wl, -rpath=/opt/gstreamer-sdk/lib 'pkg-config --cflags --libs gstreamer-0.10'

libtool을 사용하는 경우라면 자동으로 -Wl과 -rpath를 추가해줄것이기 때문에 걱정이 필요없다.


튜터리얼 소스코드 받기


git clone git://anongit.freedesktop.org/gstreamer-sdk/gst-sdk-tutorials

/opt/gstreamer-sdk/share/gst-sdk/tutorials


튜터리얼 빌드하기


시스템과 충돌없이 올바른 라이브러리로 빌드하기 위해서 Gstreamer SDK shell로 먼저 진입해야 한다. /opt/gstreamer-sdk/bin/gst-sdk-shell 을 실행하여 쉘로 진입하라.

그리고 튜터리얼 코드가 있는 폴더로 이동해서 아래 명령으로 빌드하면 된다.


gcc basic-tutorial1-1.c -o basic-tutorial-1 'pkg-config --cflags --libs gstreamer-0.10'


사용하려고 하는 라이브러리에 따라서 pkg-config에 추가가 더 되어야 한다.  튜터리얼코드의 아랫부분에는 필요한 라이브러리들이 순서대로 기술되어 있을 것이다.


앱 배포

배포할 앱은 반드시 필요한 라이브러리들이 함께 있어야 한다. 몇가지 옵션이 있다.

한가지는 shared sdk를 설치할거라면 앱은 /opt/gstreamer-sdk에 두고 .desktop파일을 /usr/share/applications에 만들어 두는 것이다. 문제없이 동작하게 하려면 -Wl, -rpath=/opt/gstreamer-sdk/lib 파라메터로 앱이 빌드되어 있어야 한다.

또는 wrapper script를 사용하는것이다. 이는 필요한 환경변수를 셋팅하고 나서 앱을 생성한다. 그리고 .desktop file을 /usr/share/applications에 생성한다. 가장 많이 사용되는 접근법이고 -WL, -rpath파라메터를 요구하지 않고 더 효율적이다. gst-sdk-shell파일을 둘러보아서 스크립트가 멀 하는지 알아보길 바란다.


Posted by 삼스
iOS2015. 8. 31. 14:53



호스트 연결전에 DNS Name resolving피하기


호스트에 접속하는 적절한 방법은 DNS 명을 받는 CFHost나 CFNetService같은 API가 있다. 앱에서 DNS name으로 리졸브된 ip주소로 접속을 한다고 해도 이 방법은 피해야 한다. DNS lookup은 보통 여러개의 IP주소를 반환하며 어떤 IP주소가 가장 좋은 연결을 제공하는지 알 수 없다.

최근의 대부분의 컴퓨터나 모바일디바이스들은 멀티홈을 가진다. 즉 WiFi + Ethernet이거나 3G + WiFi이거나 하는 환경이 많다. 하지만 모든 호스트가 모든 컨넥션에서 유효한것은 아니다. 예를 들어 iPhone으로 Apple TV를 제어하려고 하는 경우 App TV는 Wifi망에 있고 폰은 3G망에 있다면 이는 연결이 불가하다.

디바이스와 서버가 모두 멀티IP주소를 가지고 있다면 서버에 연결할 가장 좋은 IP주소는 어떤 네트웍에 연결되어 있느냐에 따라 결정된다. 예를 들어 가정의 멀티미디어 서버가 LAN과 WiFi IP주소를 모두 가지고 있다면 OS에서 더 빠른 네트웍을 감지할 수 있을것이며 프로그램이 이 주소를 통해 연결가능할것이다.

서버가 IPv4와 IPv6를 모두 지원하면 두 프로토콜을 사용함으로 인해 도달하지 못할 수 있다. host-name-basedAPI를 사용하여 OS는 동시에 시도를 할 수 있고 첫번째것으로 성공시킬수 있다. 앱이 먼저 찾아낸 IP주소가 어떤 주소냐에 따라서 연결이 안될 가능성 도 있다.

구형 서버로  IPv6를 지원하지 않는 경우에 AAAA형식의 IPv6주소로 접을을 요청하면 동기로 호출되는 DNS조회는 요청시간내내 블럭될것이다.(디폴트는 30초) . 만일 호스트명을 취하는 API를 사용하면 OS는 IPv4와 IPv6요청이 동시에 수행되는지 사용자가 알수 없게 할것이고 내부적으로 IPv4연결이 완성되면 IPv6연결시도는 취소할것이다.

Bonjours를 사용해서 서비스를 게시하는 경우(DHCP는 동작하지 않음) 앱이 해당서비스를 찾아서 IP주소를 얻어내었다면 해당 디바이스가 IP주소를 유지하는 동안에는 유효하다. 하지만 DHCP서비스가 다시 온라인이 되게 되면 IP주소는 변경되고 이전 IP주소는 더이상 유효하지 않게 된다. 만일 게시이름으로 연결을 시도하게 된다면 앱에서는 서버가 최종적으로 언어진 IP주소로 계속 연결을 할 수 있게 될것이다.

DNS Name 해결하기를 직접 피할수 없다면 먼저 CFHost API가 요구사항에 만족하는지 확인해보아야 한다. 이는 싱글주소 대신에 호스트에 주어진 모든 주소목록을 제공한다. CFHost가 만족시키지 못한다면 DNS Service Discovery API를 사용하라.



Posted by 삼스
iOS2015. 8. 31. 13:38



아래는 애플뉴스스(https://developer.apple.com/news/?id=08282015a)의 전문이다.

Supporting IPv6 in iOS 9

August 28, 2015


At WWDC 2015 we announced that iOS 9 will support IPv6-only network services. All apps submitted to the App Store must support IPv6 starting in early 2016. To make sure your app is compatible, use the networking frameworks (e.g., “NSURLSession”), avoid use of IPv4-specific APIs, and avoid hard-coded IP addresses. Before submitting your app, test for compatibility.

To learn more, read Supporting IPv6 DNS64/NAT64 Networks and watch Your App and Next Generation Networks.


WWDC2015에서 이미 언급했다는데 iOS9부터 IPv6-only network service를 지원할거라나. 코드상에 웹서비스 주소를 도메인주소를 사용하고 있다면 문제가 안되겠지만 ip주소를 사용하고 있다면 문제가 될거란다. 내년(2016) 초부터 앱스토어가 지원을 시작할거라는데 이 얘기인즉슨 그런 앱들을 리젝을 놓겠다는건지 정확히 모르겠다. 무슨 지혼자 잘났다고 IPv6를 강제한단 말인가? 장비부터 해서 갑자기 강제하면 분명히 혼란과 혼돈이 있을것인제...

무튼 IPv4전용 API는 하드코딩된 IP주소를 모두 피해야 한다. 기존 앱들은 물론 다 바까야겠지.

자 그럼 불평만 할떄가 아니다 기존앱들은 그리고 새로운앱들은 또 어떻게 대응해야 할까를 연구해보자...

만일 앱이 high-level network api를 즉 NSURLSession이나 CFNetwork frameworkd의 API들을 사용하고 연결은 도메인명으로 하고 있다면 아무것도 할게 없다.

만일 도메인명으로 연결하고 있지 않다면 가이드(Avoid Resolving DNS Names Before Connectiing to Host)를 참고







Posted by 삼스
iOS2015. 8. 28. 16:12


http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

https://developer.apple.com/library/prerelease/ios/technotes/App-Transport-Security-Technote/


App Transport Security Technote


앱과 웹서비스간의 보안을 더 향상시킬 수 있는 기능이다.

디폴트연결 요구사항들로 구성한다. 이 요구사항은 보안연결을 위한 최적의 구성을 기술한다.

App은 이 동작에 대해 오버라이드하거나 기능을 아예 꺼버릴 수 있다.

iOS 9.0, OSX 10.11 이후부터 지원한다.


디폴트 동작

iOS 9.0과 OSX 10.11에서 돌아가는 앱에서 NSURLConnection, CFURL 또는 NSURLSession을 이용한 모든 통신은 Transport security의 디폴트 동작을 사용한다.

이 요구사항에 부합하지 않은 모든 연결을 실패할것이다.


ATS 필수 요구사항

- 서버는 Transport Layer Security(TLS) protocol version 1.2이상을 지원해야 한다.

- 암호화는 forward secrecy를 지원하는것들로 제한된다.

- 인증서는 반드시 SHAR256이나 더 발전된 해시알고리즘을 사용해야 한다. 잘못된 인증서는 실패한다.


허용된 암호화

TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384

TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256

TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384

TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA

TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256

TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA

TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384

TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA


예외

디폴트 동작에 대한 예외를 info.plist파일을 통해서 정의할 수 있다. 해당 예외에 대한 키값들을 사용하거나 기능을 끌 수 있다. 다음은 키값들과 키값에 해당하는 타입들을 나타내었다.



NSAppTransportSecurity   Dictionary

    NSAllowsArbitraryLoads   Boolean

    NSExceptionDomains Dictionary

        <domain-name-for-exception-as-string> Dictionary

            NSExceptionMinimumTLSVersion String

            NSExceptionRequiresForwardSecrecy Boolean

            NSExceptionAllowsInsecureHTTPLoads Boolean

            NSIncludesSubdomains Boolean

            NSThirdPartyExceptionMinimumTLSVersion String

            NSThirdPartyExceptionRequiresForwardSecrecy Boolean

            NSThirdPartyExceptionAllowsInsecureHTTPLoads         Boolean



NSAppTransportSecurity

  디폴트동작을 오버라이드할 셋팅값들을 포함하는 딕셔너리이다. info.plist의 최상위 key값


NSAllowArbitraryLoads

  NSExceptionDomains 딕셔너리에 리스터업되지 않는 도메인들에 대한 ATS를 사용할지 boolean 값으로 정의한다.

  디폴트값은 NO이고 모든 연결들에 대해 ATS를 요구한다.


NSExceptionDomains

  ATS 예외 도메인들의 딕셔너리이다. 각 키는 예외할 도메인명을 담은 문자열이다. named domain이며 예를 들면 www.google.com같은것이다.


NSExceptionMinimumTLSVersion

  최소 TLS버전으로 TLSv1.0, TLSv1.1, TLSv1.2 가 있다. TLSv1.2가 디폴트값이다.


NSExceptionRequiresForwardSecrecy

  도메인이 지원하는 암호화 요구사항을 오버라이드 한다. YES가 디폴트이며 디폴트동작에서 정의한 암호화로 제한다.

  No이면 다음 암호화가 추가된다.


TLS_RSA_WITH_AES_256_GCM_SHA384

TLS_RSA_WITH_AES_128_GCM_SHA256

TLS_RSA_WITH_AES_256_CBC_SHA256

TLS_RSA_WITH_AES_256_CBC_SHA

TLS_RSA_WITH_AES_128_CBC_SHA256

TLS_RSA_WITH_AES_128_CBC_SHA


NSExceptionAllowsInsecureHTTPLoads

  No가 디폴트값이며 모든 연결이 HTTPS를 사용할지 결정한다. 이 키값으로 도메인이 인증서없이 접근하거나 self-signed로 접근하거나, 만료되거나 호스트명 미스매치 인증으로 접근가능하도록 할 수 있다.

  

NSIncludeSubdomains

  No가 디폴트 값이며 최상위 레벨 도메인의 모든 서브도메인에도 적용할지 결정한다.


NSThirdPartyExceptionMinimumTLSVersion

NSThirdPartyExceptionRequiresForwardSecrecy

NSThirdPartyExceptionAllowsInsecureHTTPLoads

  개발자에의해 앱서비스가 컨트롤되지 않는 도메인의 경우 사용된다. <- 먼소린지???



Posted by 삼스
Linux2015. 8. 27. 09:24



sudo apt-get update

sudo apt-get upgrade

sudo apt-get install bison

sudo apt-get install g++

sudo apt-get install flex



/*1. flex 설치

flex download

tar xfv flex-2.5.39.tar.bz2

./configure 

make

sudo make insatll

*/


2. glib 설치

glib download : http://ftp.acc.umu.se/pub/gnome/sources/glib/2.46/glib-2.46.0.tar.xz

dependencies

- pkgconfig : http://www.freedesktop.org/software/pkgconfig/

- libiconv : http://www.gnu.org/software/libiconv/

- gettext : http://www.gnu.org/software/gettext/


2.1 pkgconfig

pkgconfig download

wget http://pkgconfig.freedesktop.org/releases/pkg-config-0.19.tar.gz

./configure

make

sudo make install


export PKG_CONFIG_PATH=/usr/local/bin/pkg-config 를 ~/.bash_profile에 추가


2.2 libiconv

libiconv downloa

http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz

./configure

make

sudo make install



2.3 gettext

gettext download

wget http://ftp.gnu.org/pub/gnu/gettext/gettext-0.19.6.tar.xz

./configure

make

sudo make install


2.4 libffi

libffi download

ftp://sourceware.org/pub/libffi/libffi-3.2.tar.gz

./configure

make

sudo make install



2.4 glib

glib download

wget http://ftp.gnome.org/pub/gnome/sources/glib/2.44/glib-2.44.1.tar.xz

sudo apt-get install zlib1g-dev

//sudo apt-get install libffi-dev


./configure --with-libiconv

make

sudo make install


아래 에러가 발생할 수 있다.

error while loading shared libraries: libiconv.so.2: cannot open shared object file:


/usr/local/lib에 libiconv.so.2가 있음에도 불구하고 link가 연결이 제대로 안되는 경우가 있다.

ldd $(which iconv)를 입력해서 아래와 같이 나오면 이런 경우이다.

녀애 

$ ldd $(which iconv)

linux-gate.so.1 => (0xb77b1000)

/usr/local/lib/preloadable_libiconv.so (0xb76cc000)

libiconv.so.2 => not found

libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb74f7000)

/lib/ld-linux.so.2 (0xb77b2000)


이 떄는 다음 명령을 한번 실행한다.


sudo ldconfig -v


다시 ldd명령을 수행하면 정상적으로 링크가 걸린것을 확인할 수 있다.


ldd $(which iconv)

linux-gate.so.1 => (0xb77b4000)

/usr/local/lib/preloadable_libiconv.so (0xb76cf000)

libiconv.so.2 => /usr/local/lib/libiconv.so.2 (0xb75c1000)

libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7416000)

/lib/ld-linux.so.2 (0xb77b5000)



3. liboil

liboil download

http://liboil.freedesktop.org/download/liboil-0.3.17.tar.gz

./configure

make

make install


4. gstreamer

아래 패키지들을 모두 다운로드 및 설치 진행(http://gstreamer.freedesktop.org/data/src)

./configure && make && sudo make install

gstreamer

gst-plugins-base

gst-plugins-good/bad/ugly

gst-ffmpeg는 deprecated됨. gst-libav설치(https://bugzilla.gnome.org/show_bug.cgi?id=676260)

sudo apt-get yasm  nasm 먼저 설치 후 진행

순서로 설치


mp3파일 재생 테스트

gst-launch-1.0 playbin uri=file:///home/leeyosam/gmediarender/iu-knee.mp3

이 때 아래와 같은 에러가 날 수 있다.

gst-launch-1.0: symbol lookup error: gst-launch-1.0: undefined symbol: _gst_date_time_type

이 경우 ldconfig를 실행해주면 된다.

sudo ldconfig




Posted by 삼스
Android/Wear2015. 8. 24. 16:43


안드로이드 웨어는 HTTP통신 같은 인터넷 억세스를 지원하지 않는다고 한다. 이에 어떻게 데이터 전송을 지원하는지 알아보기 위해 아래 문서를 정리해 보았다.  실제로 이 API를 wrapper하여 http get을 지원하는 lib를 만들어서 공개한 개발자도 있다.

좀더 정확히 얘기 하면 Bluetooth로 연결이 되지 않은 상태에서 wifi에 연결이 되어 있다면 인터넷 억세스가 다이렉트로 가능하다. 하지만 bluetooth가 연결이 되는 순간 먹통이 된단다. 동시에는 안된다는데... 왜 안될까??? 단말과 워치간의 데이터 동기화를 위해서는 이 때는 Data Layer API로 bluetooth를 통해서 전송하는 방법을 사용해야 한다고 한다. 이건 맞다고 보는데 이 때 wifi가 진짜 안될까????? 워치가 없으니 확인할 방법은 없고.. 궁금하긴 하다. 워치 구매하면 제일먼저 해야할 일이다.


http://developer.android.com/training/wearables/data-layer/index.html


Data Layer API for Wearable은 Google Play Service의 일부로 폰과 웨어러블간의 통신채널을 제공한다.

데이터오브젝트의 셋을 제공하는데 전송 및 동기화 그리고 관련 콜백리스너를 제공한다.


Data Items

  DataItem한개는 단발과 웨어러블간에 자동으로 동기되는 데이터 스토리지를 제공한다.


Messages

  MessageApi클래스는 메시지들을 전송할 수 있으며 RPC에 기반하여 웨버러블에서 단말의 미디어플레이어를 제어한다거나 단말에서 웨어러블에 인텐트를 시작하거나 할 수 있다.

  Message는 단방향 및 양방향 통신을 모두 제공한다.

  단말과 웨어러블이 연결되면 메세지를 전달하기 위해 시스템은 큐잉하고 성공코드를 반환한다. 디바이스가 연결이 되지 않으면 에러를 반환한다. 


Asset

  Asset객체는 이미지 같은 바이너리데이터를 전송하기 위한 객체이다. Data item에 asset을 첨부하면 시스템은 자동으로 잘 전송해준다. 


WearableListenerService(for services)

  WearableListenerService를 확장하여 서비스에서 중요한 이벤트를 처리할 수 있다. 시스템은 lifecycle을 관리하고, data item이나 message를 전송해야 하면 서비스에 바인딩하며, 서비스가 더이상 필요없으면 언바인딩한다.


DataListener(for foreground activities)

  액티비티에서 DataListener를 구현하여 액티비티가 포그라운드로 진입히 중요한 이벤트를 처리할 수 있다. WearableListenerService대신에 사용하면 앱이 사용중에만 변경을 감지할 수 있다.


Channel

  ChannelApi클래스를 사용하여 큰 data item들을 전송할 수 있다. 음악이나 동여상파일들을 단말에서 웨어러블에 전송이 가능하다. ChannelApi는 다음과 같은 잇점이 있다.

  • 하나이상의 단말간에 대용량 데이터 파일을 전송한다(DataItem에 Asset으로 자동동기화를 하지 않고 가능). 디스크용량을 절약이 가능하다. DataApi클래스의 경우 동기화하기 전에 Asset을 복사한 후 수행하기 때문에 디스크용량 절약에 불리하다.
  • MessageApi 클래스를 사용하여 아주 큰사이즈를 안정적으로 전송이 가능하다.
  • network server나 micorophone같은 스트림데이터를 전송할 수 있다.


주의) 단말과 웨어러블간의 통신을 위해서 설계가 된 API이기 때문에 두 단말간에 셋업해야 하는 API가 있다. 예를 들어 low-level 소켓통신을 시도해서는 안된다.


안드로이드 웨어는 여러개의 디바이스와 동기화를 지원한다. 한단말에서 노트를 편집하면 연결된 모든 디바이스에 동기화가 된다. 동기화를 위해 구글 서비스에 클라우드 노드가 생성되고 이 노드를 통해서 동기화가 된단다.



Posted by 삼스
Linux2015. 8. 19. 11:24


GMediaRender는 UPnP media render중 하나이며 UPnP media server로부터 media content(video, audio, image)를 재생한다. 


UPnP A/V 는 3티어 시스템으로 구성된다.

Server, Renderer, Controller


UPnP controller로 UPnP Renderer에 UPnP Server의 컨텐츠를 재생하도록 명령을 내릴수 있다.


GMediaRenderer는 다음 3가지 디펜던시가 있다.

1. GNU C Compiler(gcc), 2.95 or later

2. libupnp 1.6.0 or later(BSD license)

3. GStreamer 0.10(LGPL)

그 외 GNU/Linux 라이선스로 제공되는 UPnP A/V 관련 오픈소스 프로젝트들

A/V Content Servers

- MediaTomb

- GeeXboX uShare

- GMediaServer

_ Cidero Internet Radio Server


A/V Content Renderers

- GMediaRender

- djmount

- Compère - Coherence-based media renderer

UPnP-Control for Mplayer

- A/V Content Controllers


Cidero Media Controller

- gUPnP universal control point (part of gupnp-tools)








Posted by 삼스
Mac world2015. 7. 14. 16:09



윈도우와 맥에서 모두 읽기 쓰기가 가능한 포맷은 NTFS이며 맥에서는 별도 소프트웨어의 힘을 빌려서 쓰기까지 가능하다. 

아래 순서대로만 따라하자.

진작에 알았더라면.. ㅎㅎ;;


1. FUSE for OSX  설치

2. NTFS-3G 설치

NTFS-3G설치시에는 ‘설치 유형’에서 하단에 ‘사용자화’라는 버튼을 볼 수 있는데 여기서, ‘Install Type’ -> ‘MacFuse’ 옵션을 체크 해제해야 한다.

3. FUSE-wait  설치

4. 리부트.


추가

위 구성에서 엘캐피탄 업그레이드 후 쓰기가 안되는 경우 다음과정으로 진행

1. Paragon NTFS 14 설치

2. 터미널에서 sudo nano /etc/fstab 실행

3. LABEL=DRIVE_NAME none ntfs rw,auto,nobrowse 입력 후 저장

DRIVE_NAME은 공백이 들어가면 안되며 NO NAME의 경우 NO\ NAME으로 입력해야 한다.




Posted by 삼스