안녕하세요, 타이젠 개발자 윤진입니다.

 

 

타이젠 스튜디오 1.0.1 버전으로 오며 여러가지가 바뀌었지만,

무엇보다도 기존 버전보다 개발자 친화적인 환경을 구축했다는 것이 고무적입니다.

 

앱을 처음 개발할 때는 다른 사람의 코드를 음미하며 자기 식으로 소화하기 마련인데,

타이젠 스튜디어의 템플릿 코드와 샘플 코드가 제법 그럴 듯하여 타이젠 앱 개발에 꽃길이 될 것입니다.

 

 

 

타이젠 스튜디오를 실행하면 왼편에 Project Explorer가 보입니다.

아직 한 번도 프로젝트를 생성한 적이 없다면 위 캡쳐화면처럼 Project Explorer 'Create new project'라는 버튼이 보일겁니다(단순 텍스트처럼 보이지만 버튼입니다!).

이미 프로젝트를 생성하였다면 생성한 프로젝트가 Project Explorer에 나타날 것입니다.

위의 'Create new project'를 누르거나 메뉴>File>New>Tizen Project의 경로로 진입하여 새 프로젝트를 생성합니다.

 

 

 

새 프로젝트로는 템플릿 코드나 샘플 코드를 생성할 수 있습니다.

템플릿 코드나 샘플 코드 모두 빌드가 되지만 앱의 '완결성'에서 차이가 있습니다.

템플릿 코드는 빈 부분을 개발자가 직접 채워 앱으로 완성해 나가야 하지만,

샘플 코드는 샘플용으로 개발이 완료된 앱으로 기본적인 동작을 테스트할 수 있습니다.

타이젠 앱 개발에 익숙하다면 템플릿을 생성하여 빈 공간은 직접 채우면 됩니다.

 

 

 

템플릿이든 샘플이든 선택을 하면 그 다음 단계는 프로파일과 버전을 정하는 것입니다.

프로파일로는 현재 모바일/웨어러블/티비가 있습니다.

버전은 각 프로파일별로 명시되어 있습니다.

자신이 개발하고자 하는 앱이 최종적으로 어떤 프로파일에 올라갈 것인지 고민이 필요한 시점입니다.

물론 어느 프로파일을 선택하든 타이젠 앱의 개발방법론은 같습니다.

 

 

 

프로파일과 버전을 정하였다면, 이제는 네이티브앱으로 개발할지 아니면 웹앱으로 개발할지 정해야합니다.

네이티브앱는 C와 C++을 이용하여 앱을 개발할 수 있고,

웹앱은 CSS, HTML, JS로 앱을 개발할 수 있습니다.

네이티브와 웹앱에 대해 더 자세한 정보를 얻고 싶으시다면,

위의 메뉴에서 'Show more'를 줄러주세요.

타이젠 공식 사이트에서 설명하는 네이티브앱과 웹앱에 대한 소개를 볼 수 있습니다.

 

 

 

이번 메뉴에서는 타이젠 스튜디오가 구비한 템플릿 혹은 샘플의 종류를 선택할 수 있습니다.

올초에 템플릿과 샘플 코드가 대대적으로 정비된 것으로 기억하는데요,

타이젠 플랫폼에 새로운 기능이 추가될 때마다 새로운 코드들이 SDK에 계속 추가될 예정입니다.

 

템플릿/샘플 코드들은 SDK를 인스톨될 때 함께 설치되는 방식이 아니고,

사용자가 위의 화면에서 템플릿/샘플을 선택하면 비로소 다운로드받는 방식이기 때문에,

언제나 서버에 올라간 최신의 코드를 다운로드 받으실 수 있습니다.

 

 

 

마지막으로 프로젝트 이름과 패키지 ID를 지정해주어야 합니다.

프로젝트 이름은 타이젠 스튜디오 내에서 고유하게 사용되는 이름입니다.

 

패키지 ID는 앱이 고유하게 가져야 하는 이름입니다.

패키지 ID가 같으면 타이젠 플랫폼이 동일한 앱으로 인식하여 기존의 패키지를 덮어씌워버립니다.

예를 들어, 에뮬레이터에 org.tizen.app 패키지가 설치하였는데,

다시 org.tizen.app이란 동일한 패키지 ID의 앱을 개발하여 설치하면 기존에 설치한 앱이 지워지고 새로 설치될 수 있습니다.

물론 타이젠 앱스토어에 앱을 올리게 되면 앱스토어 정책으로 고유한 패키지ID를 가지게 될 테니 걱정할 필요는 없습니다.

 

 

 

패키지를 생성하면 Tizen Manifest Editor가 사용자를 반겨줍니다.

Tizen Manifest Editor도 타이젠 스튜디오가 업데이트되면서 개발자 친화적으로 바뀌고 있네요.

Project Explorer에서 자신이 생성한 프로젝트 내에 tizen-manifest.xml 파일을 더블클릭해도 Tizen Manifest Editor가 열립니다.

 

 

상단에 구비된 6개의 탭 중 Overview 탭을 먼저 살펴보겠습니다.

Application ID

앱이 가지는 고유한 ID입니다.

한 패키지에는 복수개의 앱이 함께 패키징될 수 있습니다. 그렇기에 앱마다 서로를 구분할 수 있는 고유한 ID가 필요합니다.

만약 패키지 내에 앱이 하나라면 패키지이름과 동일하게 지어도 무관합니다.

Package

위에서 설명한 패키지 ID를 입력합니다.

만약 프로젝트 진행 중에 패키지 ID를 변경하고 싶다면 여기서 바꾸면 됩니다.

Version

앱의 버전을 명시합니다.

앱스토어에 올린다면 버전을 제대로 명시하여 앱구매자들이 버전업데이트를 할 수 있도록 해야합니다.

Api Version

타이젠 플랫폼은 계속 버전 업데이트를 하고 있습니다.

개발한 앱이 플랫폼의 어떤 버전인지 명시를 해주어야 합니다.

Label

홈화면에 표시되는 앱의 이름입니다.

Localization 탭에서 추가로 다국어로 앱이름을 지정할 수 있습니다.

Exec

앱의 실행파일의 이름을 지정합니다.

Icon

앱의 아이콘파일을 지정합니다.

홈화면에 앱이 표시될 때 아이콘 파일을 참고합니다.

Author

개발자를 적어넣습니다.

Description

개발하고 있는 앱을 소개합니다.

 

 

 

Overview를 모두 채워넣었다면 UI를 가진 기본적인 앱을 개발할 준비가 된 셈입니다.

하지만, 여기서 한 걸음 더 나아가 카메라, FM 라디오, GPS, WiFi 등과 같은 자원을 사용하고 싶다면 해당 기능들을 Features 탭에서 추가해주어야 합니다.

각 피쳐값은 개발자가 사용할 API 그룹에 따라 결정됩니다.

API 레퍼런스를 보면 해당 API 그룹을 사용할 때 필요한 피쳐가 명시되어 있습니다.

앱을 개발하며 새로운 API를 사용하게 된다면,

해당 API 그룹에서 요구하는 feature를 보고 Features 탭에서 추가해주면 됩니다.

 

 

 

Privileges 탭에서는 앱이 지니고 있어야할 권한을 추가해주어야 합니다.

권한은 API 그룹 내에서 각각의 API마다 필요한 Privilege를 확인할 수 있습니다.

Feature처럼 Privilege도 API 레퍼런스를 참고하여 개발하면서 추가하면 됩니다.

 

 

 

Localization 탭에서는 홈화면에 나타나는 앱이름을 다국어에 맞게 설정할 수 있습니다.

위에 간단하게 3개국에 대해 설정해보았는데요,

앱을 사용하는 사람이 한국어를 기본언어로 설정해두었다면 이 앱은 홈화면에서 '앱'이라는 이름으로 보일 겁니다.

 

 

 

Advanced 탭에서는 앱이 실행될 때 사용할 수 있는 여러 기능들을 지정할 수 있습니다.

단순히 샘플앱을 실행하는 지금 포스팅에서는 넘어가도록 하겠습니다.

하지만, 굉장히 흥미로운 기능이 많으니 차후에 하나하나 설명하도록 하겠습니다.

 

 

 

샘플앱을 생성하였다면 이제 에뮬레이터를 띄워서 확인해보도록 하겠습니다.

위의 캡쳐이미지와 같은 단추를 눌러 에뮬레이터 매니져를 띄워주세요.

 

 

 

에뮬레이터 매니져를 통해 다양한 프로파일의 다양한 버전에서 동작하는 에뮬레이터를 띄울 수 있습니다.

이 예제에서는 모바일 프로파일 버전 2.4로 샘플을 생성하였기에 그에 맞는 에뮬레이터를 선택하고 런치를 누르겠습니다.

만약 자신이 원하는 프로파일/버전의 에뮬레이터가 없으면 Create 버튼을 눌러 새로운 설정값의 에뮬레이터를 생성하면 됩니다.

 

 

 

에뮬레이터를 띄우면 락화면이 먼저 나옵니다.

마우스를 드래그하여 락화면을 풀면 홈화면이 나옵니다.

 

 

 

위의 빌드버튼을 눌러 우선 앱을 빌드를 합니다.

샘플앱은 이미 검증을 받았기 때문에 빌드에러없이 빌드가 완료될 겁니다.

 

 

 

그리고 위의 Run 버튼을 눌러 샘플앱을 실행하면,

에뮬레이터에 자동으로 설치한 후 앱이 실행됩니다.

 

 

 

 

오늘은 간단히 타이젠 샘플앱을 생성하여 실행하는 방법을 알아보았습니다.

타이젠 스튜디오의 메뉴가 여러므로 깔끔해져서 개발 편의성도 증진된 것처럼 느껴지네요.

그럼 즐거운 하루 보내세요.

  1. GEGEGi 2017.09.23 16:31

    타이젠이 많이 발전하였지만 그래도 아직 몇가지는 거슬려보이네요. ㅠㅠ
    1. 이클립스 기반 - 이클립스가 훌룡한 IDE인것은 사실이고 아직 아주 많은 곳에서 사용되지만 개발자들의 유입이 필요한 타이젠에서 개발자들의 트랜드가 멀어진 IDE 선택이라 생각됩니다.
    2. UI & UX - 뭐 사실 뭐가 좋은 UI인지 UX인지 모르는 개발자입니다만 정말 개발자가 만든것같은 UI UX라고 생각됩니다. (하늘색 눈뽕 으악!)
    3. 샘플 - 1.0.1에서는 수정되었는지 모르겠지만 1.0.0 당시에는 샘플앱의 코드 베이스가 구버전 타이젠인 경우가 많았습니다. SDK 상에선 EFL을 도입했지만 전혀 코드가 업데이트가 되지 않았다던가 (오래전 기억이라 아닐수도있습니다.) 각 샘플앱마다 코드 디자인(패턴)이 상이하다던가

    사실 초보 개발자라 많은 오류가있는 개인적인 생각이지만 나름 많은 관심을 가졌던 OS가 힘을 못쓰는 모습이 조금은 슬퍼서 주저리 써보았습니다.

    • 성실한 의견 감사합니다.
      보내주신 세가지 의견은 잘 간직해야겠네요.
      계속 버전 업데이트하며 실망시켜드린 부분을 개선할 수 있도록 하겠습니다.
      관심을 가져 주셔서 감사합니다~!

안녕하세요, 타이젠 개발자 윤진입니다.

 

2016년 3월, 러시아 모스크바로 파견나온지 거의 9개월이 흘렀습니다.

잠시 타이젠 개발에서 물러나 이 곳 추위와 싸우고 있는 동안, 타이젠 개발툴인 스튜디오 1.0.1이 나왔습니다.

지난 10월 28일, 타이젠 홈페이지를 통해 타이젠 스튜디오 1.0.1이 공개되었으니 오늘로 꼭 한달되었네요.

본업에 너무 소홀했던 자신을 책망하며 타이젠 스튜디오 1.0.1을 설치해보고자 합니다.

 

 

 

타이젠 스튜디오 1.0.1을 다운로드 받으려면 우선 타이젠 홈페이지에 접속해야합니다.

타이젠 홈페이지 첫 화면에는 Tizen의 다음 개발툴인 .NET이 홍보되고 있습니다.

.NET으로 타이젠앱을 개발할 날도 멀지 않았는데, 이 부분은 차후 다시 포스팅하겠습니다.

우선은 공식적으로 최신 안정화 버전인 타이젠 스튜디오 1.0.1에 집중하도록 하겠습니다.

 

타이젠 스튜디오는 타이젠 앱 개발을 위해 제공되는 툴입니다.

메인 메뉴 하단의 Application Developers 컬럼에서 'App Developer Site' 눌러주세요.

만약 뿐만 아니라 플랫폼 자체를 알고 싶으시면 Platform Developers 참고하세요.

 

 

타이젠 앱 개발자 사이트에서도 역시 .NET에 대한 홍보가 올라와 있습니다.

그리고 바로 그 밑에 Tizen Studio 1.0.1의 다운로드 페이지에 진입할 수 있는 버튼이 있네요.

 

 

 

타이젠 스튜디오를 설치하면 타이젠앱의 양대산맥인 네이티브앱과 웹앱을 모두 개발할 수 있다는 문구가 눈에 띄네요.

게다가 윈도우, 우분투 뿐만 아니라 맥OS에서도 타이젠 스튜디오를 사용할 수 있다고 하네요.

어느 운영체제나 설치과정은 거의 동일하게 진행되기 때문에, 여기서는 윈도우 기준으로 설치를 해보도록 하겠습니다.

 

< Tizen Studio 1.0.1 with IDE installer>

< Tizen Studio 1.0.1 with CLI(command line interface) installer>을

위의 두 가지 버전 중 IDE installer를 설치하겠습니다.

 

 

 

용량은 473메가 정도인데 러시아에서도 1메가바이트/초 정도의 속도가 나오네요.

아주 칭찬해. J

다만, 파일명이 web-ide라고 되어 있어서 저처럼 native 개발자가 보기에는 웹앱만 개발할 수 있는 툴인 것으로 오해할 수 있어보입니다.

 

설치파일을 다운로드한 후 실행해보세요.

타이젠 스튜디오를 설치하기에 앞서 JDK가 설치되어 있는지 체크를 하게 되어 있습니다.

그리고 만약 JDK가 설치되어있지 않다면 아래와 같은 팝업창이 볼 수 있습니다.

 

 

 

타이젠 SDK는 이클립스를 사용하고 있기 때문에 오라클 JDK가 필요한데,

제 경우에는 새 노트북이라서 JDK가 설치되어 있지 않습니다.

 

사실, 이 팝업에 약간 감동한 것이 과거 타이젠 2.3 SDK를 설치할 때까지만 해도,

JDK를 설치해야한다는 무미건조한 메시지만 있어서, JDK 다운로드 페이지는 알아서 찾아야 했습니다.

하지만, Tizen Studio 1.0.1에서는 버튼만 누르면 다운로드를 받을 수 있는 사이트로 안내해주세요.

물론 가장 좋은 것은 버튼을 누르면 최신의 JDK까지 알아서 설치하는 것이겠지만 그 부분은 법률적인 문제가 있을 테니 해결하기 쉽지 않아보입니다.

 

 

 

오라클 페이지에 방문하여 중앙 하단에 있는 JDK 다운로드 버튼을 누릅니다.

16년 11월말 현재 Java SE Development Kit 8u111와 Java SE Development Kit 8u112를 받을 수 있는데요.

어느 것을 받아도 상관없지만 여기서는 Java SE Development Kit 8u112를 받아보겠습니다.

jdk-8u112 버전도 195메가나 되기 때문에 다운로드를 받는데 (러시아에서는) 약간 시간이 걸립니다.

JDK 인스톨 위저드의 지시에 따라 자신의 상황에 맞게 설치하면 됩니다.

경우에는 Next 눌러 설치과정을 완료했기 때문에 여기서 따로 설명하진 않겠습니다.

 

 

 

JDK가 정상적으로 설치가 되었다면,

소프트웨어 라이선스와 관련된 처음으로 팝업창이 나옵니다.

라이선스부분에 대해서는 예전에 한 번 언급한 적이 있어서 다시 보진 않겠습니다만,

팝업 디자인이 전보다 깔끔하게 바뀐 점은 짚고 넘어가고 싶습니다.

기존 팝업 스타일은 짙은 색상이 주로 쓰여 다소 칙칙한 느낌이었는데, 이번 스타일은 전보다는 많이 좋아졌습니다.

왼편 하단에 있는 느낌표를 선택하면 인스톨러 버전이 나오는데, 이 정보가 과연 필요한 정보인지는 고민이 되는군요.

 

 

 

다음 화면에서 SDK와 Data를 저장할 수 있는 위치를 정할 수 있습니다.

예전 버전과 마찬가지로 각각 C:\tizen-studio와 C:\tizen-studio-data를 따르고 있습니다.

하지만, 개인적으로 루트 리렉토리 밑에 달리는 것을 선호하지 않아 적당히 바꿔주겠습니다.

 

 

 

경로만 정해주면 바로 설치를 시작합니다.

기존 버전과 동일하게 버튼 두번만 누르면 기본적인 툴을 설치할 수 있게 해놓았습니다.

 

 

 

인스톨이 완료된 시점에 추가 패키지를 설치하겠느냐는 체크박스가 보입니다.

추가 패키지는 다양한 버전의 타이젠 앱을 개발을 위해 필요한 패키지를 의미합니다.

물론 네이티브앱을 개발하기 위한 패키지들도 추가로 다운로드 받아야합니다.

이제야 앞에 파일명이 web-ide라고 불려진 이유를 찾게되었습니다…

 

 

 

패키지 매니져를 통해 아래와 같은 아래와 같은 개발패키지들을 받을 수 있습니다.

- Tizen 2.4 Mobile Native App. Development(IDE)

- Tizen 2.4 Mobile Web App. Development(IDE)

- Tizen 2.3.2 Wearable Native App. Development(IDE)

- Tizen 2.3.2 Wearable Web App. Development(IDE)

- Tizen 2.3.1 Mobile Native App. Development(IDE)

- Tizen 2.3.1 Mobile Web App. Development(IDE)

 

Main SDK 탭에서는 자신이 개발할 앱에 맞춰 해당 패키지를 선택해주어야 합니다.

우선 2.4 Mobile 버전의 에뮬레이터와 Native IDE를 받도록 하겠습니다.

2.4 Mobile의 Emulator와 Native app. Development(IDE) 옆에 install 버튼만 누르면 됩니다.

 

Extension SDK 탭에서는 Certificate과 관련된 Extension들을 설치할 수 있습니다.

Certificate는 이미 한 번 소개한 적이 있기 때문에 이번에는 생략하도록 하겠습니다.

 

기존 버전과는 달리 유려한 디자인으로 업데이트된 점은 흥미롭지만,

패키지매니져를 인스톨 과정이 아니라 인스톨을 끝마친 후에 내보여서,

사용자 입장에서는 이 부분이 중요하지 않은 선택이라 오해할 수 있습니다.

 

오랜만에 포스팅이라 별로 쓴 것도 없어보이는데 시간만 오래 걸렸네요.

그럼 좋은 하루 보내시고 다음에 뵙겠습니다.

안녕하세요, 타이젠 개발자 윤진입니다.


올 3월 러시아로 건너온 이후 3개월만에 포스팅을 하게 되었습니다.

회사에서는 러시아의 지역전문가가 되라고 모스크바에 유학을 보냈는데,

누군가에 기대에 부응할 정도로 잘 해내고 있는지 모르겠습니다.


6월 7일자 모스크바 기온


일단 너무 추워요. :(

5월 말에 한껏 늦봄 내지는 초여름 기운이 느껴지더니, 요 며칠 다시 겨울로 돌아갔습니다.

오늘 최저 기온이 4도입니다.

6월에 4도라면 추운거 맞죠?

이번 주 내내 바람을 동반한 비가 계속 될거라는데 어서 따뜻해졌으면 좋겠습니다.



모스크바 스콜코보 IT 단지


지난 주에는 모스크바 외곽의 스콜코보란 지역에 다녀왔습니다.

스콜코보는 러시아 정부가 야심차게 IT산업을 육성하고 있는 지역입니다.

지난 2010년 재임 중이던 메드베데프 전대통령이 부자들 별장촌이었던 스콜코보 지역을 첨단 과학기술 단지로 변신시켰습니다.

당시 신문기사를 보면 러시아판 실리콘밸리라고 엄청난 홍보를 했는데요.

현재의 규모를 보면 실리콘밸리라고 보기엔 다소 무리가 있고 우리나라 판교테크노밸리랑 유사한 규모입니다.

최초 스콜코보를 건설할 때는 판교테크노밸리의 절반 정도의 사이즈로 계획을 잡았는데요,

6년이 지난 지금은 판교테크노밸리의 수준(기업 1000여개 / 근로자 6만여명)까지 올라가고 있습니다.



스콜코보 스타트업 빌리지 게이트


그리고 스콜코보에서 열리는 가장 큰 규모의 행사가 <스타트업 빌리지>입니다.

<스타트업 빌리지>에서는 이름 그대로 젊은 개발자들의 흥미진진한 스타트업 프로젝트를 볼 수 있습니다.

아이디어가 있는 곳에 투자가 있어야겠죠.

그래서 <스타트업 빌리지>측에서는 적극적으로 러시아 국내외 투자자들을 초청합니다.

2013 첫 행사때는 참가자가 3,000여명 정도였는데 올해는 12,000명이었다고 하니 <스타트업 빌리지>는 스콜코보와 함께 고속성장을 하고 있습니다.


 

스타트업 빌리지 매표소


스타트업 빌리지 매표소에서 입장권을 구매하였습니다.

입장권으로 6월 2일(목) / 3일(금) 이틀간 자유롭게 입장할 수 있습니다.

1000루블을 주고 샀으니 우리돈으로 대충 2만원 정도 됩니다.



스타트업 빌리지 내에 조성된 바자


스타트업 빌리지 한켠에는 바자(시장)가 마련되어 있었습니다.

여기서는 총 83개 스타트업 프로젝트의 아이템을 구매할 수 있더군요.

공기청정기, 수치측정기, 전동자전거, 드론, 무인항공기, 3D 프린터, 산업로봇, 렌탈시스템, 기상예측시스템 등

갖가지 분야의 온갖 상품이 수많은 개발자의 이목을 끌고 있었습니다.

 

 

스타트업 빌리지의 타이젠 부스

 

그래도 뭐니뭐니해도 제 관심을 끌었던 곳은 타이젠 부스였습니다.

타이젠 부스는 스타트업 빌리지의 메인무대 위치하고 있어서 쉽게 찾을 수 있었습니다.

부스에는 'Tizen' 러시아어식 발음(Тайзен)으로 표기해놓았더군요.

ТАЙЗЕН 뒤에 표기된 РУ는 '루'라고 읽는데 러시아 도메인을 의미합니다.

영어로는 .ru라고 씁니다.

러시아의 대부분 기업들은 .ru를 사용하고 있습니다.

타이젠의 상징인 푸른 바람개비에 붉은 색이 들어가 있네요.

심벌이나 이름이 늘상 보던 것과는 달라 다소 낯설지

러시아 로컬화의 단면으로 보여 흥미롭기도 합니다.

 


Artik 시리즈에 올라간 타이젠 플랫폼


타이젠 부스 가운데에는 그 동안 수 없이 듣기만 했던 삼성 Artik 놓여져 있었습니다.

비교적 자그마한 Artik1 사이즈는 크지만 다양한 하드웨어가 탑재된 Artik5, Artik10 있었습니다.

데모시연자가 Artik10에서 돌아가는 타이젠 플랫폼을 보여주었는데요.

부팅시 등장하는 타이젠 로고와 부팅 직후에 등장하는 심플 홈화면이 무척이나 반갑더군요.

 


Artik10의 부팅 직후 모습


사실 심플 홈화면은 타이젠 SDK용으로 개발되었는데요.

몇년 전 심플 홈화면을 개발했을때 기억이 주마등처럼 스쳐갔습니다;

말 그대로 '심플' 홈이라 별다른 기능은 없지만 꽤나 열심히 개발했었습니다.

지금은 다른 유능한 개발자가 관리하고 있으니 더 나아지겠죠. :)


타이젠 부스를 가득 채운 것은 러시아 업체들이었습니다.

타이젠 플랫폼 위에서 동작하는 엔진이나 앱을 개발하는 3rd party인데요,

앱들의 완성도를 보고 꽤나 놀랐습니다.

아직 서남아 시장에서만 타이젠 모바일이 출시되었는데 러시아에서 완성도 높은 앱을 보게 될 줄이야!


 

타이젠 3rd party 스푸트니크사

 

스푸트니크사의 지도앱과 브라우져앱


스푸트니크사는 타이젠 플랫폼 위에서 동작하는 지도앱과 브라우저앱을 개발하고 있습니다.

스푸트니크 담당자에게 물어보니 이미 안드로이드와 아이폰에도 지도앱과 브라우저앱을 개발한 바 있다고 합니다..

그리고 지도앱과 브라우저 뿐만 아니라 이미 개발된 다른 앱들도 타이젠용으로 포팅하고 있다고 하더군요.

포팅하는데 어려움은 없는지 물어보았는데요,

2명의 개발자가 2 정도 걸려 간단히 포팅을 했다는 놀라운 얘기를 해주었습니다.

기본코드가 C++ 짜여져서 타이젠 플랫폼에 컴파일만 하여 간단히 올렸다고 하더군요.

 


마이오피스 프로그램

 

마이오피스사는 워드, 엑셀, 프리젠테이션 앱을 개발하고 있었습니다.

이 앱들은 원활한 협업을 최우선 순위로 하여,

컴퓨터, 태블릿, 모바일 등에서 동시에 작업할  있도록 앱을 개발하고 있었습니다..

워드와 엑셀은 아직 문서읽기만 가능한 수준으로 개발한 상태이나

올해 안에 편집기능도 사용할 있도록 업그레이드할 예정이라고 합니다.


 

시큐리티 프로파일

 

마지막으로 살펴본 것은 ViPNet(Virtual Private Network)입니다.

ViPNet은 송수신 데이터를 암호화하여 데이터를 안전하게 주고 받게 해줍니다.

자체 암호화 기술을 이용하여 와이파이로도 안전하게 데이터 통신이 가능하다고 하더군요.

타이젠 프로파일에 시큐리티 엔진을 탑재하여 타이젠 플랫폼에 포함할 예정이라고 합니다.

플랫폼에 탑재한다는 것은 소스도 오픈한다는 의미인데요,

소스전체를 오픈하는지 다른 방식으로 플랫폼에 기여한다는 것인지는 확인해봐야합니다.

어쨌든 담당자의 말로는 플랫폼 탑재는 타이젠만 가능한 방식이기 때문에,

아이폰이나 안드로이드에서는 이러한 시큐리티 엔진을 사용할 수 없을거라고 자신있게 말하더군요.

 


타이젠 부스에 설치된 기어VR


타이젠 부스를 여기저기 헤집고 다니며 질문을 늘어놓으니,

부스의 담당자가 타이젠에 대해 알고 있냐는 질문을 하더군요.

타이젠 개발자라고 하니 역으로 타이젠 플랫폼에 대한 질문을 쏟아내는데,

타이젠으로 무언가 잘해보고 싶다는 진심이 느껴졌습니다.

타이젠 부스를 방문한 다른 러시아 개발자들도 많았습니다.

아직은 낯선 이방의 플랫폼에 대해 이것저것 질문을 하며 관심을 보이더군요.

타이젠 부스 근처에서는 카메라맨과 리포터가 와서 타이젠에 대한 인터뷰도 따갔습니다.

멀고 러시아 땅에서 타이젠에 대한 관심이 무척이나 흥미로웠습니다.

그들의 작은 관심이 언젠가는 큰 결실이 될 거라 생각합니다.


아프니까 개발자다, 윤진 .

  1. 2016.06.08 15:42

    비밀댓글입니다

  2. 1465979768 2016.06.15 17:36

    좋은글 감사

  3. 1465980258 2016.06.15 17:44

    좋은하루되세요

  4. 1465980478 2016.06.15 17:47

    좋은글 감사

  5. 2016.08.25 23:11

    비밀댓글입니다

    • 안녕하세요. 답변이 늦어서 죄송합니다. 제가 지금 러시아에 파견을 와서요, 블로깅을 잠시 소홀히하고 있습니다. :) (많이 늦었지만) 아직 문의하실게 있으시면 언제든 문의해주세요 :)
      이미 SCSA 시험이 진행중이지요? 좋은 결과 있으시길 기원합니다.

      감사합니다.


안녕하세요, 타이젠 개발자 윤진입니다.


지난 1월 23일(토)에 열린 < Tizen Talks 2016 in Seoul >의 발표자료를 공유합니다.

1월 29일(금) 현재 총 다섯개 세션의 발표자료가 공개되었습니다.

여섯번째 세션의 발표자료는 준비되는대로 덧붙이겠습니다.


이세문 연구원, "Tizen Application Inside Out"

http://www.slideshare.net/silverlee2/tizen-application-inside-out


정우현 연구원, "타이젠 UI앱의 필수, EFL 파헤치기"

http://www.slideshare.net/silverlee2/tizen-uifw-efl


문관경 연구원 , "더 빠르고 더 유연한 윈도우 시스템(Wayland on Tizen 3.0)"

http://www.slideshare.net/silverlee2/tizen-window-system


우상정 연구원, "바닥부터 만들어보는 Tizen"

http://www.slideshare.net/again4you/tizen-talk-2016-in-seoul


윤  진 연구원, "타이젠 오픈소스의 커미터가 되어보자! "

http://www.slideshare.net/silverlee2/how-to-be-a-tizen-committer


이승환 연구원, "Tizen SDK를 이용한 Tizen Platform 개발"

< 준비중 >


발표자료를 참고하시다가 의문이 생기면 Tizen Talks 공식그룹에 문의해주세요.

제 발표자료 중에 궁금하신게 있으면 공식그룹 혹은 여기에 문의하시면 됩니다.

최대한 빠른 시간 안에 궁금증을 해결해드리겠습니다.


다만, 플랫폼 개발자들이기 때문에 회사의 상품화 전략&계획은 모릅니다.

궁금증을 해소해드리고 싶지만 대답 못해드리는 점 양해바랍니다.


이번 행사에서는 동영상 촬영을 하지 않았습니다,

차기 행사에서 촬영하는 것을 적극 고민해보겠습니다.

발표자들도 자기 발표를 반추할 수 있고,

행사에 참석하지 못하신 분들도 참고할 수 있을 만한 자료가 필요하단 생각이 듭니다. :)


그럼 즐거운 하루 보내세요~

끝_

  1. 코코콩 2016.02.01 16:57 신고

    감사합니다~ 잘받았습니다

    • 코코콩님~ 안녕하세요~
      발표자료만으로는 모든 내용을 이해하는데 부족하겠지만...
      재미있게 봐주세요~ 히히;

  2. 질문있습니다. 2016.02.03 23:28

    안녕하세요!

    몇가지 질문이 있습니다.

    1. 타이젠 전체소스코드를 다운받고

    빌드 후 결과물로 iso파일을 생성해 낼 수 있을까요!?


    2. 타이젠을 qemu에뮬레이터환경에서 작동시킬수 있는지 궁금합니다.

    • 안녕하세요~
      질문하신 내용은 TT 그룹에서 하시면 더 정확한 답변을 얻으실 수 있습니다.
      https://www.facebook.com/groups/tizentalks/

      제가 아는 내용으로 답변을 드리면,
      1. 전체 소스를 다운로드 받는 것은 가능합니다.
      다만 어느 용도로 사용할 것인지에 따라 필요한 소스를 추려야 합니다.
      모바일인지 웨어러블인지에 따라 필요한 드라이버나 사용하는 오픈소스 그리고 프레임워크가 다릅니다.
      필요한 패키지를 모아 이미지 파일을 만들 수 있습니다.
      https://source.tizen.org/documentation/reference/mic-image-creator
      관련 문서들은 여러가지가 있긴 한데요,
      최근에 직접 이미지를 만들지 않아서요.
      직접 해보시면 약간의 시행착오가 있을 수 있습니다.
      막히는 부분이 있으면 말씀해주세요~

      2. 위에서 만든 이미지 파일을 타이젠 에뮬레이터에 올릴 수 있습니다.
      qemu에서도 올릴 수 있습니다.
      https://wiki.tizen.org/wiki/Emulator
      위의 문서가 좋은 출발점이 될 것으로 생각합니다.

      그럼 좋은 하루 보내세요~!


안녕하세요, 타이젠 개발자 윤진입니다.


2016년 1월 23일 토요일 오전 10시,

강남에 있는 삼성전자 서초사옥에서 Tizen Talks 행사가 열렸습니다.




현업에서 개발을 하고 있는 개발자들이 나서서 만든 첫번째 행사였는데요,

타이젠 개발자들이 외부 개발자와 호흡할 수 있는 값진 시간이었습니다.

외부 개발자 분들께서 얻어가신 것만큼,

타이젠 개발자들도 많은 고민거리를 얻었습니다.




이번 행사에서는 타이젠 개발자들이 일방적으로 발표하는 형식을 취했지만,

장차 개발자 상호간 자유롭게 소통하며 생각을 공유할 수 있는 장이 되리라 기대합니다.

영역을 세분화하여 그때그때 화두가 되는 이야기를 게릴라 성으로 진행하는 것도 재미있겠네요.



오프닝 중에 뒤에서 촬영한 사진


행사 장소가 협소하지만 무려 90여분께서 참석해주셨습니다.

개인적으로 진심 50명만 와도 대성공이라고 생각했었는데요,

그보다 더 많은 분들이 겨울의 한복판에 서초사옥까지 와주셨습니다.


사내 세미나를 진행할 만한 협소한 장소,

다소 불편한 의자,

그리고 와이파이도 없고,

전원케이블도 모자랐습니다.


저희 개발자들이 저희들 넋두리만 풀어놓을 생각에 미쳐 준비하지 못했습니다.

다음 행사때에는 참여해주시는 분들의 편의를 위해 더욱 고민하겠습니다.

불편을 끝까지 감수하고 자리를 빛내주신 분들께 진심으로 감사드립니다.



오프닝 중인 박영주 연구원님


행사의 시작과 끝은 박영주 연구원님께서 진행해주셨습니다.

이번 행사를 총기획하시며 꿈을 현실로 만들어주셨습니다.

오프닝 세션 중에 박영주 연구원님께서 이 자리를 기념하고 싶다며 객석을 촬영하셨는데요,

그 때 찍은 사진을 입수하였습니다.


박영주 연구원님이 촬영한 사진


오프닝 중에는 대략 60여분이 계셨는데요,

토요일 아침부터 와주셔서 감사합니다.

이 감사한 마음을 어떻게 표현해야 전달될까요?




두 번째 세션은 이세문 연구원께서 발표해주셨습니다.

"Tizen Application Inside Out"을 주제였는데요,

타이젠 플랫폼을 전체적으로 훑어보고 Application 작성에 대한 큰그림을 보여주셨습니다.

발표 후 푸시 등 여러가지 질문이 인상적이었고 답변에서 내공이 느껴졌습니다.




세번째 세션은 정우현 연구원께서 "타이젠 UI앱의 필수, EFL 파헤치기"에 대해 발표하셨습니다.

아들 사진을 예제로 사용하셨는데 굉장히 인상적이었습니다.

개인적으로는 이번에 처음으로 정우현 연구원님의 발표를 들었는데요,

앞으로도 계속 거래(?)하길 희망합니다.




네번째 세션은 문관경 연구원께서 진행하셨습니다.

점심 전 마지막 세션으로 "더 빠르고 더 유연한 윈도우 시스템(Wayland on Tizen 3.0)" 주제로 진행하였는데요,

윈도우 시스템 전체를 훑어보고 나아가 Wayland까지 흥미진진한 이야기가 펼쳐졌습니다.


개인 발표 외에 전체 발표를 유기적으로 연결하기 위해 힘써주셨는데요,

다시 한 번 감사드립니다.




점심 후 첫 세션은 우상정 연구원께서 진행해주셨습니다.

"바닥부터 만들어보는 Tizen"이란 주제로 중간중간 동영상도 보여주셨는데요,

여러 유명한 책의 저자인 만큼 내공이 상당하셨습니다.

이 세션은 차후에 실습세션으로 재탄생하길 희망합니다.




점심 후 두번째 세션은 제가 진행하였습니다.

"타이젠 오픈소스의 커미터가 되어보자!"란 무척이나 재미있는 주제를 맡았는데요;

개인적으로는 참여자분들께서 많이 호응해주셔서 너무 즐거웠습니다.


발표 중간에 3930의 의미를 묻는 문제가 있었는데요,

3월 9일 3.0으로 해석해주신 분,

집에와서도 계속 생각날 정도로 기발한 답변이었습니다.

혹시 이 글을 보시면 댓글 좀 남겨주세요;

우리 친해지죠.

(3930의 의미는 참석자들만 아는 것으로... 비밀 하나씩 갖고 가는걸로... 히히)


그 외에도 활발히 질문에 응해주시고 C++에 대한 답변자료를 주신 서주영님께 감사의 말씀을 전하고 싶습니다.

다음에는 TT 발표자로도 모시고 싶다고 백번쯤 얘기했으니 내년에 그의 발표를 볼 수 있을지도 모릅니다.




마지막 세션은 이승환 연구원께서 진행하셨습니다.

"Tizen SDK를 이용한 Tizen Platform 개발"에 대한 내용이었는데요,

SDK는 외부개발자가 타이젠을 접하는 시작점인 만큼 큰 관심이 모아졌습니다.

제게도 SDK에 대한 문의가 많이 들어왔는데요,

이번 세션과 이번 인연을 통해 궁극적으로 SDK가 더욱 진화하리라 확신합니다.


TT는 작년 9월 외부 발표를 마치고 나서부터 밑그림을 그려나가기 시작하였습니다.

그 와중에 많은 분들께서 아낌없이 조언을 해주셨습니다.

이민석 교수님께서는 현실적이면서 명쾌한 이야기를 해주셨습니다.

그런 조언들로 더 진중하게 고민하며 행사를 치룰 수 있었습니다.

TT를 준비하며 유우영님께서 진행하신 행사에도 갔었는데요,

타이젠 토크의 미래를 상상할 수 있도록 도와주셨습니다.

역시 대단하세요!


지난 두달동안 발표자료를 만들었고,

지난 2~3주 동안 세션간 유기적인 호흡을 위해 수차례 리허설을 진행하였습니다.

(저는 비록 리허설 자리에는 없었지만... 고생하신 점 잘 알고 있습니다)


평소에는 개발자로서의 삶을 살다가,

어제 오랜만에 발표자로서의 하루를 보내셨을 발표자분들 다시 한 번 감사합니다.


매 세션마다 어디서도 듣지못한 내용이 들어 있던데요,

직접 개발하는 사람만이 알 수 있는 디테일,

기발한 아이디어들 모두 너무 좋았습니다.


발표자 외에 행사를 위해 애써주신 분들의 이름을 남깁니다.

이은영 연구원님, 박문경 연구원님, 손보연 연구원님, 이근선 연구원님, 김수필 연구원님, 한준규 연구원님 고생 많으셨습니다.

그리고 임지혜 책임님의 행사진행조율, 조은비 책임님과 UX팀의 포스터는 정말 큰 도움이 되었습니다. 

마지막으로 이효건 부사장님, 김두일 상무님 아낌없는 지원 감사합니다.


TT는 개발자들끼리 개발을 함께 즐길 수 있는 놀이터로 나아가길 희망합니다.


감사합니다.

끝_

  1. 2016.01.24 20:01

    비밀댓글입니다

    • 안녕하세요, Heracy님.
      이렇게 빨리 3930님(?)을 찾을 수 있을지 몰랐습니다.
      멀리서 오셨는데 가치있는 시간이었다고 하셔서 얼마나 다행인지 모릅니다. :)
      차후에 또 만나게 되면 꼭 같이 인사나누고 싶어요.
      얼굴이 얼핏 기억나긴 하지만 꼭 먼저 아는척 해주세요!
      기회가 되면 여러가지 많은 이야기를 나누는 것도 좋겠네요.
      그럼 열심히 공부하시고 남은 방학 알차게 보내세요~

      감사합니다.
      윤진 드림.

  2. 2016.01.25 02:35

    비밀댓글입니다

    • 안녕하세요? 디씨님. 저와 같은 곳에서 일하시나 보군요! 더더 반갑습니다. 소프트웨어 회사는 정말 모든면에서 다르더군요. 요즘 가장 많이 드는 생각은 역시 사람이 제일 중요하다... 입니다. 대체할 수 없더라구요. 방문해주셔서 감사합니다!

  3. 2016.01.25 03:24

    비밀댓글입니다

    • 안녕하세요, Hoyuo님. 행사에 참여해주셔서 감사합니다. 언제나 듣고 싶은 세션 위주로 들으시면 됩니다. 히히. 어떤게 제일 유익하셨는지요? 다음 행사때 참고하여 준비하도록 하겠습니다. 감사합니다~

  4. YOhoho 2016.01.26 22:12

    고생하셨습니다!!!!!!!
    오후에 진행 되었던 플랫폼 관련 섹션이 재밌었네요
    이런 행사 더 자주 해주세요~~~~~~~~~~

    • 안녕하세요~ YOhoho님.
      무언가 재미난 세션이 있었다고 하시니 정말 다행입니다. 히히;
      다음에는 더 재미난 세션을 준비하도록 하겠습니다!
      즐거운 하루 보내세요~


안녕하세요, 타이젠 개발자 윤진입니다.


지난 한 달간 온오프믹스를 통해 Tizen Talks의 참가자를 받아왔습니다.

참고 : [Tizen Talks 2016 in Seoul] 타이젠 개발자 행사 참가자 2차 추가모집

생각보다 많은 분들께서 참석 의사를 밝히셔서 굉장히 놀랐습니다.


타이젠에 관심있는 대학생들 뿐만 아니라,

공기업, 대기업, 벤쳐기업 등 다양한 곳에서 근무하시는 분들이 참가신청을 해주셨습니다.

서울 뿐만 아니라 대구, 부산 등 지방에서 올라오시는 분들도 계시더군요.

관심을 가져주셔서 다시 한 번 감사합니다.


애초에 행사는 20~30명을 위해 기획되었지만,

인원모집 단계에서 총원을 100여명까지 늘렸습니다.

마음 같아서는 참가신청을 원하는 모든 분들을 받아들이고 싶었지만,

장소가 협소하여 어쩔 수 없이 온오프믹스 참가신청을 마감하였습니다.

현재 대기인원 포함 200여분이 등록을 하셨기에 대기등록도 어렵습니다.

참석을 원하는 분은 따로 알려주세요.


애초의 세션 발표안이 약간 수정되었습니다.

참가자를 모집하며 듣고 싶은 내용에 대한 정보를 수집하였는데요,

좀 더 깊이있게 그리고 폭넓게 파고 들어야 하는 세션은 다음으로 미루기로 결정하였고,

플랫폼 전체를 훑으며, 서로 유기적으로 연결되는 세션을 남겨두었습니다.



박영주, Application, "타이젠을 말하다."

이세문, Application Framework, "Tizen Application Inside Out"

정우현, UI Framework, "타이젠 UI앱의 필수, EFL 파헤치기"

문관경, Window system, "더 빠르고 더 유연한 윈도우 시스템(Wayland on Tizen 3.0)"

우상정, Kernel / System Framework, "바닥부터 만들어보는 Tizen"

윤  진, Native App, "타이젠 오픈소스의 커미터가 되어보자! "

이승환, SDK Plugins, "Tizen SDK를 이용한 Tizen Platform 개발"


이번 행사를 위해 어디에서도 들을 수 없는 내용을 준비하고 있습니다.

발표자 분들께서 한창 리허설을 하고 계실 수도 있겠네요.



권오훈, Service Framework, "타이젠 서비스 개발 공통기능 파헤치기"

김기동, Security, "더 안전해진 개인정보 관리"

강석현, Web App, "Javascript Is Eating The World"


상기 세 개 세션은 다음 TT때 찾아뵙도록 하겠습니다.

개인적으로 꼭 듣고 싶은 세션들이어서 아쉬움은 크지만,

일회성 행사가 아니기에 다음 TT를 기다려보기로 합니다.



이 행사는 개발자들이 직접 주관하는 행사입니다.

현업에서 코드를 짜고 있는 개발자들이 만든 행사이기에,

여러가지로 부족한 점이 많이 있습니다.


원래의 취지는 개발자들끼리 한 번 모여서 '우리끼리' 넋두리를 늘어놓아보자 정도인데요,

행사 참석자가 많아져서 그냥 넋두리만 늘어놨다가는 안될 것 같더군요.


그래서 개발자들이 코딩하다 말고 장보고 준비하여 다과를 마련하였습니다.

대단한 것은 아니나 귀엽게 봐주셨으면 좋겠습니다.


주차는 기본적으로 불가하나,

먼 지역에서 오신 분들에게는 예외적으로 주차하실 수 있도록 하겠습니다.

이 부분은 참석자분께서 받은 메일로 답변주시면 됩니다.


며칠 안남았네요.

날도 추운데 감기 조심 하시고 행사날 뵙겠습니다.

끝_

  1. 코코콩 2016.01.20 11:06 신고

    흐어어어... 참석하고싶으나........ㅠㅠ

    혹시 발표자료 올려주실수 있으신가요?

    • 안녕하세요~ 코코콩님.
      제가 만든 자료는 Tizen Talks 그룹 및 본 블로그에 올릴 예정이고,
      다른 발표자 분들의 자료는 Tizen Talks에 올리려고 합니다. :)


안녕하세요, 타이젠 개발자 윤진입니다.


개인적으로 흥미진진한 일들이 잔뜩 벌어졌던 2015년이 이렇게 끝났네요.

<아프니까 개발자다> 블로그를 조심스레 시작한 것이 2015년이었는데요,

2016년에는 TT(Tizen Talks 2016 in Seoul)와 함께 야심차게 시작해보려 합니다.


혹시 아직도 TT가 무엇인지 모르시는 분이 있나요?

그렇다면,

[Tizen Talks 2016 in Seoul] 타이젠 개발자 행사 개최

[Tizen Talks 2016 in Seoul] 타이젠 개발자 행사 참가자 2차 추가모집

위의 글들을 참고해주세요.

(물론, 대부분의 개발자분들께서 모르실 겁니다; 고백하자면 무명의 행사에 가깝습니다.)


TT에서는 여러가지 흥미로운 이야기들이 많이 다뤄질텐데요,

그 중에서도 마지막 세션은 절대 놓치면 안됩니다.

"타이젠 오픈소스의 커미터가 되어보자"

위의 주제로 뜨거운 30분을 보낼 예정입니다. 하핫;

30분이란 시간은 너무나 짧기 때문에,

철저히 시간을 분할하여 하고 싶은 이야기는 다 풀어내려고 합니다.


우선 마지막 3분은 질의응답을 위해 남겨두어야겠지요?

사실 3분과 5분 사이에서 진중한 고민을 하였는데요,

- 어려운 내용을 다루는 세션도 아니고,

- 중간중간에 질문을 받을 예정이라 3분이면 충분할거라 생각합니다.

만약 질문이 하나도 없다면 무려 3분이나 일찍 세션을 마칠 수도 있겠죠. :)

하루종일 발표를 듣느라 고생하신 참석자분들의 안녕을 위해 3분을 희생할 각오는 하고 있습니다.


질의응답에서 줄인 2분은 마지막 10분에 붙여 무려 12분 동안,

실제로 소스 컨트리뷰션할만한 만만한 코드를 살펴보며 팁을 방출하는 시간을 가지려 합니다.

컨트리뷰션할만한 대상을 고민하고 있는데요,

하나는 연습용으로 사용하라는 의미로 개인적으로 만든 타이젠 프로젝트를 공유할 생각이고(6분),

다른 하나는 타이젠에 올라갈 메신져 서비스 + 앱 개발 소스를 살펴보려 합니다(6분).

당연히 위에 언급한 두개의 프로젝트는 오픈소스로 진행되고 있고,

소스를 빌드하여 타이젠 플랫폼에 탑재하여 동작을 확인할 수도 있습니다.

위의 프로젝트에 그럴듯한 커밋을 올려주신다면 기꺼이 패치를 받아들이고자 합니다.

위에 언급한 프로젝트는 제게 리뷰권한이 있기 때문에 직접 리뷰하려고 합니다. :)


그러면 이제 남은 시간은 전반부 15분이겠네요.

전반부에는 크게 10가지의 필수 정보를 공유하고자 합니다.

- 타이젠 오픈소스 전체를 살펴보자!

- 타이젠 오픈소스를 받아보자!

- 오픈소스의 수정포인트를 찾아보자!

- 앱이라면 SDK에서 빌드를 해보자!

- 프레임워크라면 OBS를 통해 빌드를 해보자!

- 서브밋 권한 / 리뷰 권한 / 메인테인 권한의 차이는 무엇일까?

- 패치를 푸시하여 보자!

- 리뷰어를 추가하여 보자!

- 코드리뷰를 통해 1:1 과외를 받아보자!

- 소스가 반영되는 짜릿한 경험을 해보자!


위의 내용을 하나씩 풀어가다 보면 15분도 격하게 짧게 느껴질 지도 모르겠네요.

자고로 최고의 발표는 청중을 지루하지 않게 만드는 것인데요,

따분한 발표자의 발표를 즐겁게 들어주길 갈망해보겠습니다.

간절히 기원하면 전 우주가 도와준다고 하네요.


발표자료는 만들고 있는 중인데,

완성을 하지도 않고 포스팅을 하는 이유가 있습니다. :)

혹시나 위의 주제와 관련하여 추가로 알고 싶으신게 있는지 댓글을 받아볼까 해서요.

궁금한 점이 있다면 주저말고 달아주세요.

어떤 내용이라도 상관없습니다.

그러면 능력이 닿는한 발표내용에 담도록 하겠습니다.


새해 첫 글은 이렇게 마치도록 하겠습니다.

온갖 즐거운 일로 가득찬 새해를 보내시길 기원합니다.


끝_


* References

https://source.tizen.org/

https://review.tizen.org/git/

https://review.tizen.org/gerrit/#/admin/groups/

https://source.tizen.org/documentation/developer-guide/getting-started-guide/contributing-code-tizen

https://source.tizen.org/documentation/developer-guide/getting-started-guide/tizen-development-working-mechanism




안녕하세요, 타이젠 개발자 윤진입니다.


얼마 전에 TT(Tizen Talks) 행사를 개최한다는 사실을 알려드렸는데요.

예상 외로 많은 분들이 관심을 가져주셔서 참가자 1차 모집을 마감하였습니다.

1차 모집 인원은 발표장 크기에 걸맞게 50명으로 책정했었지요.


비록 국내에 타이젠 모바일 제품이 출시되지 않았지만,

타이젠이 탑재된 기어시리즈가 널리 알려지고 있어서 10명만 와도 성공이라고 생각했었죠.


사실 발표자만 10명이 넘고,

행사운영으로도 그만한 숫자의 사람들이 투입이 되는데요,

행사를 준비하는 사람이 참가하는 사람보다 많아도 실망하지 말자고 다짐하고 있습니다.

(사실, 무명의 행사에 10명만 와도 성공이죠)


실제로는 얼마나 와주실지 아직도 걱정스럽기는 하지만,

그래도 참석의사를 밝히신 분이 50명이 넘었다는 사실에 감탄하고 있습니다.

그리고 대기자 명단에 올려서 참석의사를 적극적으로 피력하는 분도 계셨습니다.

타이젠 행사에 관심을 가져주는 모든 분께 진심으로 감사드립니다.


그래서 발표장을 좀 더 널직한 곳으로 변경하였습니다.

물론 현재까지 온오프믹스를 통해 신청의사를 밝히신 50분이 모두 오시진 못하겠지만,

백만분의 일의 확률로 모두 오실 수도 있을테니 참가자를 더 받으려면 공간을 넓혀야죠.


행사장소는 삼성전자 서초사옥 3층 그대로이지만,

3층에 있는 가장 넓은 대강의장에서 진행하려 합니다.

총 백여명이 들어갈 수 있는 공간입니다.




사진 촬영 : 박문경 연구원님


물론 공간이 넓어진 만큼 부담스러운 마음도 생기긴 합니다.

좁은 곳에서 10명은 왠지 가득차 보이지만,

넓은 곳에서 10명은 굉장히 휑해보일테니까요;

그래서 공간을 넓히는 것에 대한 상당한 부담감이 있지만,

장소가 모자라는 것보다는 남는게 차라리 나을테니,

공간이 휑해서 오는 심리적 압박은 준비하는 쪽에서 스스로 이겨내기로 했습니다.


온오프믹스에 추가로 참가신청을 받을 수 있도록 인원을 늘려놓았습니다.

애초에 계획했던 50명에서 100명으로 2배 늘렸는데요,

50명이 가득차서 헛걸음 하셨던 분들은 다시 신청해주세요.



2차 추가모집으로 등록된 사람은 '15. 12. 25 기준으로 78명입니다.

참석자 100명에 추가 대기자 50명으로 설정해두었습니다.

만약 참석예정자 100명이 꽉찬다면 대기자로 등록해주세요.

참석예정자분들께 전화/문자로 참석여부를 확인한 후 대기자 분들을 추가로 확정할 예정입니다.

그러니 연락가능한 전화번호를 꼭 남겨주세요 :)

참석신청은 여기에서 하실 수 있습니다.

그리고 각종 문의는 TT 공식사이트에서 하실 수 있습니다.

https://www.facebook.com/groups/tizentalks/


끝으로 TT 행사 댓글을 하나 언급하고 싶습니다.

황보진원님께서 "(생략)... 가능성을 보고서 울산에서 서울까지... 가려합니다. 기회가 주어진다면 직접 가능성을 보고 같은 가능성을 보는 이들과 교류하고 싶습니다. 기대하고 있습니다."라고 댓글을 남겨주셨습니다.

행사를 준비하는 입장에서 여러가지를 고민하게 만드는 댓글입니다.

먼길 오시는 만큼 헛된 걸음으로 돌아가시지 않도록 열심히 준비하겠습니다.


그럼 즐거운 하루 보내세요~

끝_



  1. 타이젠... 2015.12.27 15:14

    타이젠의 발전을 애타게 기다리는 분들도 많습니다. 저는 아니지만 타이젠폰 해외에서 직구했다가 램관리도 안되는 등 운영체제의 기본부터 개선해야 한다먀 다음 업데이트를 기다린다는 분도 있습니다.. 빨리 발전하길 바랍니다.

    • 안녕하세요? 의견 감사드립니다! 타이젠 모바일에 메모리 관련 정책은 매번 진화하고 있는 것으로 알고 있습니다. 그 사이에 불편을 느끼셨다니 여러가지로 송구스럽네요. 의견 주신 것을 소홀히 하지 않고 차기 버전에 반영할 수 있도록 하겠습니다. 감사합니다.



안녕하세요, 타이젠 개발자 윤진입니다.


드.디.어.

서울에서 타이젠 플랫폼 개발자들과 소통하는 자리를 마련하였습니다.

타이젠 플랫폼의 다양한 측면을 엿보실 수 있는 좋은 기회입니다.


박영주, Application, "타이젠을 말하다."

이세문, Application Framework, "Tizen Application Inside Out"

박춘언, UI Framework, "타이젠 UI앱의 필수, EFL 파헤치기"

우상정, Kernel / System Framework, "바닥부터 만들어보는 Tizen(Tizen from Scratch)"

문관경, Window system, "더 빠르고 더 유연한 윈도우 시스템(Wayland on Tizen 3.0)"

권오훈, Service Framework, "타이젠 서비스 개발 공통기능 파헤치기"

김기동, Security, "더 안전해진 개인정보 관리"

이승환, SDK Plugins, "Plugin을 추가하여 나만의 SDK를 만들기"

강석현, Web App, "Javascript Is Eating The World"

윤  진, Native App, "타이젠 오픈소스의 커미터가 되어보자! "


1회 TT(Tizen Talks)에서는 타이젠 플랫폼을 전체적으로 조망해보고,

2회, 3회... TT에서는 주요 Framework 별로 살펴볼 예정입니다.

타이젠 플랫폼에 관심있으신 분들의 많은 참여 부탁드립니다.


Tizen Talks 공식 그룹 : https://www.facebook.com/groups/tizentalks/

Tizen Talks 2016 in Seoul 등록하기 : http://onoffmix.com/event/59258


그럼 행사날 뵙겠습니다.

윤진 드림.

  1. YOhoho 2015.12.17 01:49

    우와아아아 기대됩니다 신청완료!

  2. 2015.12.19 08:17

    비밀댓글입니다


안녕하세요, 타이젠 개발자 윤진입니다.


Tizen 개발자 사이트에 방문해 보면 개발에 참고할만한 자료들이 많습니다.

말로만 좋다고 해봐야 입에 발린 소리를 하는 것으로 비춰질지도 모르니,

이번 포스팅은 철저히 Tizen 개발자 사이트의 자료를 이용하도록 하겠습니다.



여기에 들어가보시면 상기 그림과 같은 드럼앱 작성법이 나와 있습니다.

드럼을 치면 그에 맞는 소리가 플레이되는 간단한 앱입니다.

위의 그림만 봐도 드럼앱을 개발하고 싶은 욕구가 솟아나오시지요? :)


소리를 재생하려면 Player API를 사용합니다.

Player는 다수의 API로 구성되어 있는데,

그 중 라이프 사이클과 관련된 함수가 가장 중요합니다.

- player_create(), player_destroy()

- player_prepare(), player_unprepare()

- player_start(), player_stop(), player_pause()

위의 함수들로 Idle, Ready, Playing, Paused 상태를 관리합니다.


Player 상태 다이어그램


player_create()에서 재생을 위한 핸들을 생성해주면 Idle 상태로 진입합니다.

핸들을 이용하여 player_prepare()를 하면 비로소 재생할 준비를 합니다.

재생 준비가 되면 Ready 상태에 이르게 되는데요,

player_start()로 Playing 상태로 바뀌고,

player_pause()로는 Paused 상태로 바뀌며,

player_stop()을 실행하면 다시 ready 상태가 됩니다.


Player 상태 변이


위에서 언급한 상태 다이어그램을 함수 측면에서 살펴볼 수도 있습니다.

표에서는 각각의 함수를 실행하기 전에 수행해야할 pre-state를 확인할 수 있습니다.

대부분의 함수가 sync로 동작하기 때문에 절차적 프로그래밍을 하면 됩니다.

player_prepare_async()만이 async인데요, 드럼앱에서는 따로 사용하지 않았습니다.


우선, player 핸들을 생성하여 준비하는 단계를 살펴보겠습니다.

총 9개의 드럼이 있기 때문에 각각의 소리를 재생하기 위해서 9개의 player 핸들을 생성해야합니다.


static void init_base_player(app_data *ad)
{
player_create(&ad->player1);
player_set_uri(ad->player1, "/opt/usr/apps/org.tizen.drums/res/sounds/ride.wav");
player_prepare(ad->player1);

player_create(&ad->player2);
player_set_uri(ad->player2, "/opt/usr/apps/org.tizen.drums/res/sounds/crash.wav");
player_prepare(ad->player2);

player_create(&ad->player3);
player_set_uri(ad->player3, "/opt/usr/apps/org.tizen.drums/res/sounds/tom2.wav");
player_prepare(ad->player3);

player_create(&ad->player4);
player_set_uri(ad->player4, "/opt/usr/apps/org.tizen.drums/res/sounds/hihat2.wav");
player_prepare(ad->player4);

player_create(&ad->player5);
player_set_uri(ad->player5, "/opt/usr/apps/org.tizen.drums/res/sounds/hihat1.wav");
player_prepare(ad->player5);

player_create(&ad->player6);
player_set_uri(ad->player6, "/opt/usr/apps/org.tizen.drums/res/sounds/tom1.wav");
player_prepare(ad->player6);

player_create(&ad->player7);
player_set_uri(ad->player7, "/opt/usr/apps/org.tizen.drums/res/sounds/floor.wav");
player_prepare(ad->player7);

player_create(&ad->player8);
player_set_uri(ad->player8, "/opt/usr/apps/org.tizen.drums/res/sounds/snare.wav");
player_prepare(ad->player8);

player_create(&ad->player9);
player_set_uri(ad->player9, "/opt/usr/apps/org.tizen.drums/res/sounds/bass.wav");
player_prepare(ad->player9);
}


위의 함수를 보시면, player_create()를 9번 수행한 것을 확인할 수 있습니다.

그리고 획득한 핸들로 player_set_uri()를 사용하여 재생할 파일 경로를 입력하였습니다.

"file://"와 같은 prefix를 넣지 않고 바로 절대경로를 입력하여도 동작합니다.

파일 경로까지 입력하였으니 이제 재생을 위한 준비를 할 차례입니다.

player_prepare()함수를 사용하여 sync로 재생 준비를 마칩니다.


void play_audio(player_h player)
{
player_state_e player_state;
player_get_state(player, &player_state);
if (player_state == PLAYER_STATE_PLAYING) {
player_stop(player);
}
player_start(player);
}


이제 드럼을 터치하면 재생을 할 차례입니다.

재생을 하기에 앞서 현재 재생 중인지 여부를 확인합니다.

player_get_state() 함수를 사용하여 현재 상태를 확인할 수 있습니다.



함수를 통해 총 5가지 상태 중 하나의 값을 얻어옵니다.

만약 이미 플레이 중이라면,

player_get_stop()으로 플레이를 멈춥니다.

그리고 다시 player_start()로 재실행을 합니다.


드럼마다 이벤트 영역을 설정하여 play_audio() 함수를 실행하도록 합니다.

총 9개의 드럼이 제각각의 소리를 내는 것을 확인할 수 있습니다.

9개의 이벤트 영역을 설정하는 방법도 흥미로우니,

시간이 허락한다면 한 번 소스를 살펴보는 것도 좋습니다.


player를 위해 할당받은 자원을 정리할 차례입니다.

9개의 핸들에 대해 아래 두 함수를 이용하여 정리작업을 합니다.


    player_unprepare(app->player1);
    player_destroy(app->player1);


이상 아주 간단한 player 사용법이었습니다.

player에는 이외에도 굉장히 다양한 기능이 있습니다.

시간이 허락한다면 좀 더 복잡한 앱의 소스를 분석해보는 시간을 가져보겠습니다.


그럼 좋은 하루 보내세요~

끝_



* References

https://developer.tizen.org/

https://developer.tizen.org/community/tip-tech/drums-tizen

https://developer.tizen.org/dev-guide/2.4.0/org.tizen.native.mobile.apireference/group__CAPI__MEDIA__PLAYER__MODULE.html


안녕하세요, 타이젠 개발자 윤진입니다.


타이젠 앱개발과 관련하여 자주 접하는 질문들을 하나씩 포스팅하기로 마음 먹었었는데요,

(마음만 먹었습니다;)

근데 워낙 많은 질문이 들어와서...

내년이 되어도 모든 답변을 포스팅할 수 있을지 모르겠습니다.


일단 이번 포스팅에서는,

화면이 꺼지면 안되는 앱이 필수로 사용하는 전원 API를 살펴보도록 하겠습니다.


전원 관련 API는 총 4개가 있습니다.

여기서 CPU와 Display의 전원은 request & release 함수를 이용하여 제어하지요.

하지만, 2.4부터는 보다 강력하면서 사용하기도 쉬운 API가 추가되었습니다.

그에 따라 request & release API는 deprecated 수순을 밟고 있습니다.


그 대신 efl_util에서 window screen mode를 설정할 수 있도록 API를 제공합니다.

함수 이름에 직접적으로 언급되어 있듯,

이 함수는 윈도우의 상태를 기준으로 파워를 제어하게 됩니다.

윈도우가 화면에 보이는 상태에서만 위의 함수로 지정한 상태로 진입하고,

화면에서 완전히 사라지면 n초 후 화면은 꺼지게 됩니다.


EFL_UTIL_SCREEN_MODE_DEFAULT는 시간이 경과하면 화면을 끄고,

EFL_UTIL_SCREEN_MODE_ALWAYS_ON은 화면이 켜져있는 상태를 유지합니다.


기존에는 앱의 라이프사이클인 pause / resume 콜백에서 device power 함수를 사용하여,

- 앱이 pause가 되면 상시 전원 on에서 사용시만 on으로 변경하고,

- 앱이 resume이 되면 상시 전원 on 상태로 유지하였었는데요,


이제는 윈도우의 상태에 따라,

- 윈도우가 사라지면(곧, 앱이 pause가 되면), ALWAYS_ON 상태가 자동으로 해제되어 화면이 꺼지도록 제어가 됩니다.

- 반대로 윈도우가 나타나면(곧, 앱이 resume이 되면), ALWAYS_ON이 다시 설정되게 됩니다.

그렇기에 앱의 라이프 사이클 대신 기능의 라이프 사이클에 맞춰 함수를 사용하면 됩니다.

간단하지요? :)


그럼 오늘도 좋은 하루 보내세요~

끝_


* References

https://developer.tizen.org/community/tip-tech/keeping-screen-awake-until-pressing-hold-button

https://developer.tizen.org/dev-guide/2.4.0/org.tizen.native.mobile.apireference/group__CAPI__SYSTEM__DEVICE__POWER__MODULE.html

https://developer.tizen.org/dev-guide/2.4.0/org.tizen.native.mobile.apireference/group__CAPI__EFL__UTIL__MODULE.html

  1. 2015.12.11 23:00

    비밀댓글입니다


안녕하세요, 타이젠 개발자 윤진입니다.


타이젠 관련 행사를 진행하면 으레 받는 질문 중에 하나가 '인증'과 관련된 부분입니다.

타이젠 SDK로 소스를 빌드한 후,

패키지를 에뮬 혹은 타겟에 설치하고자 할 때 인증관련 에러를 접하게 되는데요,

알고나면 별거 아니지만 문제를 해결하기까지 시행착오를 겪는 경우가 아주 많지요.

따라서 그런 시행착오를 조금이나마 줄이고자,

타이젠 사이트에 정리되어있는 내용에 살 좀 붙여서 공유하고자 합니다.

한국어 보다 영어가 편리하신 분은 여기에서 참고하셔도 됩니다.

(위의 자료는 오픈소스그룹의 조재민 책임연구원께서 준비한 것으로 추정됩니다.)


SDK와 Z1 간에 개발자/디바이스 인증을 받는 법은 이미 포스팅한바 있습니다.

[Tizen] 타이젠 SDK와 Z1 연결이 되나요? 인증은 필수!

위의 포스팅은 전체적인 인증절차를 살피고자 문제없이 진행된다는 가정하에 쓰여졌었는데요,

처음 인증을 받고자 하는 분들은 위의 포스팅을 참고하시고,

문제가 생겼을 때 본 포스팅으로 도움을 얻으셨으면 좋겠네요.



* 인증을 위한 첫걸음, SDK Extension 설치하기

타이젠 플랫폼이 탑재된 상품은 견고한 보안을 갖추고자 다각도로 노력하고 있습니다.

따라서 Z1, Z3와 같은 모바일 상품이나,

Gear 시리즈와 같은 웨어러블 상품에서는 해킹위협을 원천차단하고자 합니다.

그 첫번째 단추가 검증되지 않은 앱을 설치하지 못하도록 막는 것입니다.

그렇기 때문에 복잡한 인증절차를 거칠 필요가 있습니다.

인증절차를 아직 밟지 않으셨다면 위에서 언급한 포스팅을 참고하여 인증을 받아주세요.

아래 링크를 참고하여 모바일 혹은 웨어러블 Extension을 설치하시면 됩니다.


- Mobile SDK Extension

http://developer.samsung.com/samsung-z


- Wearable SDK Extension

http://developer.samsung.com/technical-doc/view.do?v=T000000248



* Active secure profile is not set.
  Please check the signing configurations at Preferences > Security Profiles.

위의 에러메시지는 저자 & 장치 인증을 받지 않았을때 나타납니다.

Extension SDK를 설치하시고 저자 & 장치 인증을 먼저 받으세요.

그리고 Connection explorer에서 연결된 디바이스를 클릭합니다.

마우스 오른쪽 버튼을 눌러 메뉴를 띄운 후,

"Permit to install applications"를 선택해주세요.

(그러면 device-profile.xml을 /home/developer 디렉토리에 설치가 되죠.)

위의 절차를 정확히 수행했다면 더 이상 이런 에러가 발생하지 않을겁니다.



* 'Launching TizenApp' has encountered a problem.
  Error code: SIGNATURE_INVALID

위의 에러메시지를 자세히 읽어보면 "Check author certificates"라는 부분이 있습니다.

저자인증이 제대로 진행되지 않아서 발생하는 에러겠지요.

이미 인증을 모두 진행하셨더라도 저자 인증을 다시 진행해야합니다.

제대로 인증을 완료한 후 Connection explorer에서 연결된 디바이스를 클릭합니다.

마우스 오른쪽 버튼을 눌러 메뉴를 띄운 후,

"Permit to install applications"를 선택해주세요.

(그러면 device-profile.xml을 /home/developer 디렉토리에 설치가 되죠.)

위의 절차를 정확히 수행했다면 더 이상 이런 에러가 발생하지 않을겁니다.



* 'Launching basic' has encountered a problem.
   Errors occurred during the build.

팝업의 하단을 잘 살펴보면 "Invalid password"라는 문구가 보입니다.

인증서를 등록하셨다면 저자인증 파일을 등록하면서 패스워드를 입력하셨을 겁니다.

바로 그 패스워드가 잘못되었을 경우 위와 같은 에러가 발생합니다.

Preferences > Tizen SDK > Security Profiles

위의 경로로 진입하셔서 Author 인증시 입력한 패스워드를 다시 잘 입력해보세요.

만약 패스워드가 기억이 안나신다면 Author 인증를 새로 해주세요.



* 'Launching basic' has encountered a problem.
  Error occurred while signing the widget.
  Both an author and a first distributor must be required.
  Please check your profile information.

팝업 내용을 살펴보면 저자인증 부분이 잘못된 것을 알 수 있습니다.

저자인증시 입력한 패스워드를 다시 한 번 확인해주세요.

만약 패스워드가 기억이 안나신다면 Author 인증를 새로 해주세요.



* Registration failed.
  Reason: java.lang.Exception: Generic Exception caught.
  Given final block not properly padded.

생소한 자바에러가 보이지만 '등록(Registration)'과 관련된 부분이란 것을 눈치챌 수 있습니다.

만약 Legacy certificate로 저자 & 장치 인증을 하셨다면,

Legacy certificate 파일이 잘못되었을 수 있습니다.

제대로 된 Legacy certificate으로 다시 인증을 받아보시길 권해드립니다.


그게 아니라 저자 & 장치 인증을 각각 받았다면,

저자인증 입력한 패스워드가 잘못되었을 수도 있습니다.

저자인증을 위한 암호를 다시 한 번 입력해보세요.

암호가 기억나지 않는다면 다시 저자인증을 하시길 추천해드립니다.



* There is no certificate for the selected device.
  Please update your certificate.

위의 팝업을 만나면 장치인증 파일에 문제가 있을 수 있습니다.

SDK와 연결된 장치와 장치인증을 받은 장치가 맞는지 확인해보세요.

device-profile.xml 파일을 열어서 <TestDevice>의 DUID와 SDK 연결된 장치의 DUID를 비교하시면 됩니다.

만약 DUID가 다르다면 연결된 장치로 장치인증을 다시 받으셔야 합니다.



* Certificate has not been installed to device yet.
  Please perform 'permit to install applications' of the context menu in Connection Explorer.
  For more information, refer to Help Contents: Certificates.

위의 에러메시지는 저자 & 장치 인증이 제대로 수행되지 않았을때 나타날 수 있습니다.

인증을 하지 않으셨다면,

Extension SDK를 설치하시고 저자 & 장치 인증을 먼저 받으세요.


(인증을 이미 하신 경우 포함) 인증절차를 완료한 후,

Connection explorer에서 연결된 디바이스를 클릭합니다.

마우스 오른쪽 버튼을 눌러 메뉴를 띄운 후,

"Permit to install applications"까지 선택을 해주셔야 합니다.

(그러면 device-profile.xml을 /home/developer 디렉토리에 설치가 되죠.)

위의 절차를 정확히 수행했다면 더 이상 이런 에러가 발생하지 않을겁니다.



* 'Launching nativetest - Debug' has encountered a problem.

  Cannot create package.

패키지를 생성하지 못했다는 경고문구입니다.

문구가 구체적이지 않기 때문에 수정포인트를 잡을 수가 없네요.

이 문구는 certificate가 잘못되었을 확률이 높습니다.

Preferences > Tizen SDK > Security Profile

위의 경로에 진입하여 저자 & 장치 인증부터 다시 진행해보세요.



* 'Launching test - Debug' has encountered a problem.
  Cannot install application.

위의 에러는 패키지를 설치할 때 발생하는 에러입니다.

유감스럽게도 'Error message: Success'라고 되어 있기 때문에 더 난해졌습니다.

에러메시지가 '성공'이라고 하네요. 하핫;

이럴 때 좌절하고 싶으실지는 모르겠지만 조금만 참아주세요.


문구가 난해하기 때문에 딱부러진 해결책도 없습니다.

저자 & 장치인증서를 처음부터 다시 받아보세요.

그리고 Connection explorer에서 연결된 디바이스를 클릭합니다.

마우스 오른쪽 버튼을 눌러 메뉴를 띄운 후,

"Permit to install applications"를 선택해주세요.

(그러면 device-profile.xml을 /home/developer 디렉토리에 설치가 되죠.)

위의 절차를 정확히 수행했다면 더 이상 이런 에러가 발생하지 않을겁니다.


이상으로 인증실패 총정리편을 마치겠습니다.

그 외의 에러팝업도 있을 수 있겠죠?

여기에 언급되어 있지 않은 에러팝업을 보신다면,

tizen.org의 Q&A 게시판에서 도움을 받으시는게 가장 빠른 방법입니다.

그게 부담되신다면 답글을 남겨주세요.

담당자분께 확인하여 답변해드리겠습니다.

(시간이 좀 더 걸리겠지요.)


그럼 좋은 하루 보내세요~

끝_


* References

http://developer.samsung.com/samsung-z

http://developer.samsung.com/technical-doc/view.do?v=T000000248

https://developer.tizen.org/community/tip-tech/trouble-shooting-certification

  1. 하수 2016.07.19 01:06

    안녕하세요 타이젠 연습해보려는 학생입니다!! 간단히 native로 만들고 실행해보는데
    'Launching fakekakaotalk - Debug(1)' has encountered a problem
    The program file specified in the launch configuration des not exist

    이러는데 어떻게 해결해야하나요?? 어려운것도 없엇는데 벌써이러네요....

    • 안녕하세요. 제가 지금 러시아 오지탐험 중이라 직접 확인해볼 수가 없는데요. 심지어 인터넷도 너무 느려서 이 댓글을 확인하는것만 오분 정도 걸렸습니다. 하하. 죄송하지만 페이스북에 Tizen talks 그룹이 운영되고 있는데 거기서 한번 물어보시겠어요?


안녕하세요, 타이젠 개발자 윤진입니다.


3~4달쯤 전에 타이젠 스토어에 앱을 올렸습니다.

타이젠 스토어는 앱을 엄격하게 심사하는 것으로도 유명한데요,

(참고 : [Tizen Store] 타이젠 스토어에 앱올리기 전에 셀프체크하기)

셀프체크를 하고 앱을 업로드 하니 다행스럽게도 한 번에 통과할 수 있었습니다.


이번 포스팅에서는 타이젠 스토어에 등록된 앱에서,

타이젠 스토어 자체를 런치하는 방법을 공유하고자 합니다.

- 타이젠 스토어 메인 페이지

- 타이젠 스토어 앱 상세정보 페이지

- 타이젠 스토어 판매자 페이지

위의 세 가지 페이지로 진입할 수 있는 방법이 있습니다.


타이젠 스토어를 런치하기 위해서는 기본적으로 app_control API를 사용합니다.

app_control API는 이미 데브랩 등에서 여러 차례 발표를 했었는데요,

여기에서도 간단하게나마 파악하실 수 있습니다.

앱을 런칭하기 위해서는 privilege가 필요하니 manifest 파일에 아래 권한을 추가해주세요.

http://tizen.org/privilege/appmanager.launch


1. 타이젠 스토어 메인 페이지

타이젠 스토어 메인페이지를 띄우려면 app_control_set_app_id()를 사용하면 됩니다.

타이젠 스토어의 app id인 "org.tizen.tizenstore"를 인자로 넣어주세요.


#include <app_control.h>

app_control_h service = NULL;
int ret = -1;

ret = app_control_create(&service);
ret = app_control_set_app_id(service, "org.tizen.tizenstore");
ret = app_control_set_uri(service, "tizenstore://Main");
ret = app_control_set_operation(service, APP_CONTROL_OPERATION_VIEW);
ret = app_control_send_launch_request(service, appcontrol_callback, NULL);
app_control_destroy(service);


코드를 간결하게 표현하기 위해 에러처리는 생략합니다.

app_control_create()로 할당받은 메모리는 app_control_destroy()로 해제해주어야 합니다.

app_control_send_launch_request() 직후에 메모리를 해제하면 됩니다.


2. 타이젠 스토어 앱 상세정보 페이지

앱 상세정보 페이지에 진입하기 위해서는 우선 앱의 Content ID를 알아야 합니다.

공식 가이드에는 Package ID를 입력하라고 되어 있는데요,

실제 코드를 보면 Package ID 대신 Content ID를 넣어주고 있으니 착오없으시길 바랍니다.


Content ID는 앱을 등록할때 부여받는 ID입니다.

이미 등록한 앱이 있으시다면 Content ID를 http://seller.tizenstore.com에서 찾아보실 수 있습니다.



Seller Office > Applications > Content ID

위의 경로로 Content ID를 확인하실 수 있습니다.

이번에는 app_control_set_uri()에 "tizenstore://ProductDetail/<Content_ID>" 형식으로 채웁니다.

아래 루틴이 실행되면 타이젠 스토어 앱이 열리면서 지정된 앱 상세 페이지에 진입하게 됩니다.


#include <app_control.h>

app_control_h service = NULL;
int ret = -1;

ret = app_control_create(&service);
ret = app_control_set_app_id(service, "org.tizen.tizenstore");
ret = app_control_set_uri(service, "tizenstore://ProductDetail/<Content_ID>");
ret = app_control_set_operation(service, APP_CONTROL_OPERATION_VIEW);
ret = app_control_send_launch_request(service, NULL, NULL);
app_control_destroy(service);


3. 타이젠 스토어 판매자 페이지

타이젠 스토어에서 판매자 페이지로 진입하기 위해서는 우선 판매자 ID를 알아야 합니다.

판매자 ID도 "http://seller.tizenstore.com"에서 확인하실 수 있습니다.



Seller Office > Edit User(오른편 상단) > Basic Information

위의 경로로 진입하면 Basic Information 최하단에 Seller DeepLink를 확인하실 수 있습니다.

위의 ID를 "tizenstore://SellerApps/<Seller_ID>"의 형식으로 app_control_set_uri()에 채우세요.

그리고 런칭을 하면 판매자 페이지로 진입할 수 있습니다.


#include <app_control.h>

app_control_h service = NULL;
int ret = -1;

ret = app_control_create(&service);
ret = app_control_set_app_id(service, "org.tizen.tizenstore");
ret = app_control_set_uri(service, "tizenstore://SellerApps/<Seller_ID>");
ret = app_control_set_operation(service, APP_CONTROL_OPERATION_VIEW);
ret = app_control_send_launch_request(service, NULL, NULL);
app_control_destroy(service);


이상과 같이 Tizen Store에 연결하는 방법을 알아보았습니다.

궁극적으로 플랫폼 앱에서 다수의 앱을 연결할 때 사용하면 유용하겠네요.


그럼 좋은 하루 보내세요~

끝_


* References

https://developer.tizen.org/community/tip-tech/linking-your-application


안녕하세요, 타이젠 개발자 윤진입니다.


지난 포스팅에서는 audio in에 대해다뤘었는데요,

[Tizen] 타이젠 개발, Audio Input으로 녹음하기

이번에는 그에 대한 짝개념으로 Audio out을 다뤄보도록 하겠습니다.



audio out 계열의 함수도 audio in 계열의 함수와 유사한 점이 많습니다.

다만 in 계열이 읽어들이는 것에 초점을 맞추었다면,

out 계열은 출력하는 데에 초점이 맞춰져있습니다.

in에서 raw 데이터로 녹음을 하면 out에서 녹음된 raw 데이터를 재생합니다.

그 외에 전체적인 함수 사용법은 in이나 out이나 유사합니다.



audio out 계열 함수를 사용하려면 우선 디바이스 인스턴스를 생성해야 합니다.

audio_out_create() 함수로 디바이스 인스턴스를 생성할 수 있는데요,

sample rate, channel, type(depth)는 audio_in_create()에서도 동일하게 사용한 인수입니다.

하지만, 거기에 출력을 위해 sound_type이 추가로 들어갔습니다.



Sound manager의 session에서 사용하는 enum 값이 아닌,

Sound manager의 volume에서 사용하는 sound_type_e를 넣어주게 되어 있는데요,

audio_out 계열은 3rd party에서 사용하도록 공개된 Sound manager 의 session 보다,

System, Ringtone, Call, Voice와 같은 좀 더 넓은 선택지가 있어 보입니다.


하지만, 실제로 모든 세션을 사용할 수 있는 것은 아닙니다.

Sound manager에서 제공하는 sound_manager_set_session_type()에서 허용하는 세션으로만 설정하는 것이 맞아보입니다.



audio_out_ignore_session()은 audio_in_ignore_session()과 유사한 함수입니다.

본 함수는 audio_out으로 사운드 데이터를 출력할 때,

다른 세션의 output은 무시할 수 있도록 지정합니다.

- 곧, 현재 세션을 출력 중에 다른 세션을 시작해도 서로 무시하고,

- 다른 세션이 출력 중에 현재 세션을 출력해도 서로 무시하게 합니다.


하지만, 사운드 세션 관리는 본 함수를 사용하여 통제하는 것보다는,

Sound session manager에게 관리를 맡기는 것이 맞아 보입니다.


void play_file(char *file, int length, int ch)
{
    audio_out_h output;
    FILE* fp = fopen (file, "r");

    char * buf = malloc (length);

    printf ("start to play [%s][%d][%d]\n", file, length, ch);
    audio_out_create(44100, ch_table[ch] ,AUDIO_SAMPLE_TYPE_S16_LE, SOUND_TYPE_MEDIA, &output);
    if (fread (buf, 1, length, fp) != length) {
        printf ("error!!!!\n");
    }

    audio_out_prepare(output);
    audio_out_write(output, buf, length);
    audio_out_unprepare(output);

    audio_out_destroy (output);

    fclose (fp);

    printf ("play done\n");
}


전체적인 동작은 위의 루틴을 보면서 설명해보겠습니다.

- audio_out_create()로 sound_type까지 확정하여 디바이스 인스턴스를 생성합니다.

- audio_out_prepare()로 디바이스 버퍼링에 데이터를 쓸 준비를 합니다.

- audio_out_write()를 이용하여 데이터를 디바이스에 출력합니다.

- audio_out_unprepare()로 디바이스 버퍼링에 디바이스 출력을 멈춥니다.

- audio_out_destroy()로 생성된 디바이스 인스턴스를 정리합니다.

synchronous하게 동작하기 때문에 audio_out_write()에서 장시간 블록됩니다.


스레드 블록을 막고 싶으면 asynchronous하게 동작하는 함수를 사용하면 됩니다.

이 부분도 예제 코드를 보면서 설명하겠습니다.


int audio_io_async_test(int mode)
{
    char *buffer = NULL;
    FILE* fp_r = NULL;

    int ret, size;
    int i = 0;

    ret = audio_out_create(44100, AUDIO_CHANNEL_STEREO , AUDIO_SAMPLE_TYPE_S16_LE, SOUND_TYPE_MEDIA, &output);
    if (ret != AUDIO_IO_ERROR_NONE) {
        printf("audio_out_create failed.\n");
        return 0;
    }

    ret = audio_out_set_stream_cb(output, _audio_io_stream_write_cb, NULL);
    if (ret != AUDIO_IO_ERROR_NONE) {
        printf("audio_out_set_stream_cb failed.\n");
        audio_out_destroy(output);
        return 0;
    }

    fp_r = fopen( "/tmp/pcm.raw", "r");
    if (!fp_r) {
        audio_out_destroy(output);
        return 0;
    }

    ret = audio_out_prepare(output);
    if (ret != 0) {
        printf("audio_out_prepare failed.\n");
        audio_out_destroy(output);
        return 0;
    }

    for (i = 0; i < 10; i++) {
        printf ("-------- %d -------\n",i);
        usleep (1000000);
    }

    audio_out_unprepare(output);
    audio_out_destroy(output);

    fclose(fp_r);

    return 0;
}


위의 루틴으로 audio_out을 asynchronous하게 진행할 수 있습니다.

- 우선, 데이터 출력을 위해 audio_out_create()로 디바이스 인스턴스를 생성합니다.

- 그리고 audio_out_set_stream_cb()으로 콜백을 등록합니다. 콜백은 장치상황에 맞춰 불려집니다.

- audio_out_prepare()로 디바이스가 출력을 시작하게 됩니다.

- audio_out_unprepare()로 디바이스가 출력을 멈춥니다.

- audio_out_destroy()로 디바이스 인스턴스를 해제합니다.


static void _audio_io_stream_write_cb(audio_out_h handle, size_t nbytes, void *userdata)
{
    char *buffer = NULL;
    int ret = 0;

    if (nbytes <= 0) {
        printf ("Error!!!! %d", nbytes);
        return;
    }

    buffer = malloc(nbytes);
    memset(buffer, 0, nbytes);
   
    ret = fread(buffer, 1, nbytes, fp_r);
    if (ret != nbytes) {
        printf("Error!!!! %d/%d", ret, nbytes);
    }  
   
    ret = audio_out_write(handle, buffer, nbytes);
    if (ret > AUDIO_IO_ERROR_NONE) {
        printf("audio write success. buffer(%p), nbytes(%d)\n", buffer, nbytes);
    }
        audio_out_drain(handle);     free(buffer);
}


위의 루틴은 audio_out_set_stream_cb()으로 등록한 콜백함수입니다.

- 콜백함수가 불리면 fread()를 이용하여 파일에서 데이터를 읽어온 후,

- audio_out_write()로 디바이스에 해당 데이터를 출력하게 됩니다.

  이 함수는 write가 끝날 때까지 블록하게 됩니다.

- audio_out_drain()은 pcm 데이터가 디바이스로 완전히 나갈때까지 블록시킵니다.


이상으로 간단하게 audio out 계열 함수를 살펴보았습니다.

audio out 코드를 보며 추가로 파봐야할 포인트를 몇 개 찾았는데요,

공유할 만한 사실이 발견되면,

이 포스팅에 지속적으로 업데이트하도록 하겠습니다.


그럼 좋은 하루 보내세요~

끝_


* References

https://developer.tizen.org/dev-guide/2.4.0/org.tizen.native.mobile.apireference/group__CAPI__MEDIA__AUDIO__OUT__MODULE.html

git://review.tizen.org/framework/api/audio-io


안녕하세요, 타이젠 개발자 윤진입니다.


이번 그리고 다음 포스팅에 걸쳐 Audio I/O에 관해 다룰 예정입니다.

Audio I/O는 사운드를 raw 데이터(PCM)로 녹음하거나 재생할 때 사용합니다.

raw 데이터(PCM)란 압축하거나 다른 형태로 인코딩하지 않은 데이터를 의미하지요.



Audio input과 관련된 18개의 API가 있는데요,

위의 API를 사용하기 위해서는 microphone feature를 추가해주어야 합니다.

http://tizen.org/feature/microphone

앱의 manifest 파일에 위의 feature를 추가해주세요.

(참고 : https://developer.tizen.org/development/tools/native-tools/manifest-text-editor#feature)



Audio를 녹음하기 위해서는 우선 device instance를 만들어야 합니다.

device instance는 audio_in_create()으로 만들 수 있지요.

위의 함수를 사용하기 위해서는 privilege가 필요하니 manifest에서 권한도 추가해주셔야 돼요.

http://tizen.org/privilege/recorder


인자는 총 네 개로 세 개는 in-parameter이고 마지막 하나는 out-parameter입니다.

(타이젠은 기본적으로 out-parameter를 활용하여 인스턴스를 넘겨주는 패턴을 사용합니다.) 

sample rate, channel, type(depth)을 in-parameter로 넘겨주면,

out-parameter로 input 값이 넘어오는데 이 input 값으로 audio_in 함수 전체를 통제하게 됩니다.

input 값으로 audio_in 계열의 함수를 사용한 후,

audio_in_destroy()로 메모리를 정리해주면 됩니다.


참고로 audio_in_create_loopback()은 출력장치로 나가는 소리를 캡쳐하는 기능입니다.

- 스피커로 나가는 출력데이터를 audio_in_create_loopback()로 가져와서,

- audio_out_create()로 나가는 루틴에 대입하여 echo를 제거할 때 사용할 수 있습니다.

하지만, 이 함수를 사용하는 것은 좀 더 따져봐야할 것으로 보입니다.

Tizen의 다음 버전에서 이 기능을 지원할지는 확실치가 않아서요.

(참고로 이 부분은 멀티미디어 전문가인 '신' 책임연구원님(실명언급해도 될까요?)의 도움을 받았습니다)



audio_in_create() 직후에 audio_in_ignore_session()을 사용할 수 있습니다.

함수 설명을 보면,

"Ignores session for input"이라고 되어 있는데요(너무 단촐하네요).

다른 세션의 동작과 상관없이 녹음을 진행하기 위해 공개된 API입니다.

- 곧, 녹음을 시작할 때 타 세션을 interrupt 하지 않고,

- 타 세션이 시작하더라도 interrupt 받지 않습니다.

하지만, 기본적으로 세션관리는 Sound session manager에서 하고 있습니다.

따라서 ignore session을 이용하여 인위적으로 조절하지 않는게 좋겠네요.


int audio_io_test(int length, int num, int ch)
{
    int ret, size, i;
    audio_in_h input;
    if ((ret = audio_in_create(44100, ch_table[ch] ,AUDIO_SAMPLE_TYPE_S16_LE, &input)) == AUDIO_IO_ERROR_NONE) {
        ret = audio_in_ignore_session(input);
        if (ret != 0) {
            printf ("ERROR, set session mix\n");
            audio_in_destroy(input);
            return 0;
        }

        ret = audio_in_prepare(input);
        if (ret != 0) {
            printf ("ERROR, prepare\n");
            audio_in_destroy(input);
            return 0;
        }

        FILE* fp = fopen (DUMP_FILE, "wb+");

        if ((ret = audio_in_get_buffer_size(input, &size)) == AUDIO_IO_ERROR_NONE) {
            size = length;
            char *buffer = alloca(size);

            for (i=0; i<num; i++) {
                printf ("### loop = %d ============== \n", i);
                if ((ret = audio_in_read(input, (void*)buffer, size)) > AUDIO_IO_ERROR_NONE) {
                    fwrite (buffer, size, sizeof(char), fp);
                    printf ("PASS, size=%d, ret=%d\n", size, ret);
                }
                else {
                    printf ("FAIL, size=%d, ret=%d\n", size, ret);
                }
            }
        }

        fclose (fp);

        audio_in_destroy(input);
    }

    play_file (DUMP_FILE, length*num, ch);

    return 1;
}


위의 함수를 통해 audio_in 루틴을 전체적으로 파악할 수 있습니다.

- audio_in_create()로 디바이스 인스턴스를 하나 만들고,

- audio_in_ignore_session()으로 타 세션이 방해하지 못하도록 설정하고,

- audio_in_prepare()로 장치에서 버퍼링을 시작합니다.

- audio_in_get_buffer_size()로 시스템에서 넘겨주는 (권장) 버퍼 사이즈를 확인합니다.

  여기 있는 버퍼사이즈를 확인하여 audio_in_read()에서 버퍼를 사용합니다.

- audio_in_read()로 버퍼에 있는 데이터를 읽어 옵니다.

  synchronous하게 동작하는 API이기 때문에 데이터를 읽는 동안 블록됩니다.

- audio_in_destroy()로 최종적으로 디바이스 인스턴스를 정리합니다.


synchronous하게 동작하는 루틴이 보았다면,

이번에는 asynchronous하게 동작하는 루틴을 볼 차례입니다.


int audio_io_async_test(void)
{
    char *buffer = NULL;
    audio_in_h input;
    FILE* fp_w = NULL;
    int ret, size;
    int i = 0;
   
    ret = audio_in_create(44100, AUDIO_CHANNEL_STEREO , AUDIO_SAMPLE_TYPE_S16_LE, &input);
    if(ret != AUDIO_IO_ERROR_NONE) {
        printf ("audio_in_create_ex failed. \n");
        return 0;
    }
   
    ret = audio_in_set_stream_cb(input, _audio_io_stream_read_cb, NULL);
    if(ret != AUDIO_IO_ERROR_NONE) {
        printf ("audio_in_set_stream_cb failed. \n");
        return 0;
    }
   
    fp_w = fopen("/tmp/pcm_w.raw", "w");
    if (!fp_w) {
        printf ("cannot open a file\n");
        audio_in_destroy(input);
        return 0;
    }
   
    ret = audio_in_prepare(input);
    if (ret != 0) {
        printf ("audio_in_prepare failed.\n");
        audio_in_destroy(input);
        return 0;
    } else {
        ret = audio_in_get_buffer_size(input, &size);
        if(ret != AUDIO_IO_ERROR_NONE) {
            printf ("audio_in_get_buffer_size failed.\n");
            return 0;
        }
        else {
            printf("size(%d)\n", size);
            buffer = alloca(size);
        }
    }
   
    if(buffer == NULL) {
        printf("buffer is null\n");
        return 0;
    }
   
    printf ("loop start\n");
    for (i = 0; i < 10; i++) {
        printf ("-------- %d -------\n",i);
        usleep (1000000);
    }
   
    printf ("audio_in_unprepare\n");
    audio_in_unprepare(input);
    printf ("audio_in_destroy\n");
    audio_in_destroy(input);
   
    fclose(fp_w);
   
    return 0;
}


stream과 관련된 루틴에서는 asynchronous하게 동작하도록 콜백함수를 만들어 줘야하는데요,

콜백함수를 등록하는 루틴을 보고 콜백함수 자체를 살펴보겠습니다.

- audio_in_create()로 다비이스 인스턴스를 하나 만들어둡니다.

- audio_in_set_stream_cb()으로 asynchronous하게 이벤트를 받아 처리할 함수를 등록합니다.

- audio_in_prepare()로 디바이스에서 버퍼링을 시작하고,

- audio_in_unprepare()로 녹음을 중지합니다.

- audio_in_destroy()로 디바이스 인스턴스로 할당받은 메모리를 정리합니다.


자, 이번에는 콜백함수의 루틴을 살펴보도록 하겠습니다.


static void _audio_io_stream_read_cb (audio_in_h handle, size_t nbytes, void *userdata)
{
    const void * buffer = NULL;
       
    if (nbytes > 0) {
        audio_in_peek(handle, &buffer, &nbytes);
        if (fp_w) {
            fwrite(buffer, sizeof(char), nbytes, fp_w);
        }
        audio_in_drop (handle);
    }
}


콜백함수에서는 audio_in_peek()와 audio_in_drop() 함수를 사용할 수 있습니다.

위의 함수는 오직 콜백함수 내에서만 동작하지요.

audio_in_peek()로 버퍼링된 데이터를 buffer 인자로 받아와서 사용할 수 있습니다.

여기서는 버퍼를 fwrite를 사용하여 파일에 기록하였습니다.

그리고 나서 audio_in_drop()으로 버퍼를 정리해주었지요.


이상과 같이 audio_in 계열의 함수를 살펴보았습니다.

audio_in과 같이 raw 데이터를 다루는 함수는 기본지식이 없으면 다루기 힘듭니다.

이 기회에 학부때 중간고사용으로 공부하고 바로 까먹은 것들을 들춰봐야겠습니다.

다음 포스팅에서는 audio_out 계열의 함수를 훑어볼께요~


그럼 좋은 하루 보내세요~

끝_


* References

https://developer.tizen.org/dev-guide/2.4.0/org.tizen.native.mobile.apireference/group__CAPI__MEDIA__AUDIO__IN__MODULE.html

https://en.wikipedia.org/wiki/Pulse-code_modulation

https://en.wikipedia.org/wiki/Echo_suppression_and_cancellation

https://developer.tizen.org/development/tools/native-tools/manifest-text-editor#feature

git://review.tizen.org/framework/api/audio-io


안녕하세요, 타이젠 개발자 윤진입니다.


본 포스팅에 앞서 sound manager를 두 차례 다뤘는데요,

[Tizen] 타이젠 개발, Sound manager로 볼륨을 조절하기

[Tizen] 타이젠 개발, Sound manager로 세션을 조절하기

이번 포스팅에서는 Tone player로 사전정의된 음색을 재생/정지하는 방법을 다루겠습니다.



tone_player의 API는 단 2개입니다.

tone_player_start()로 재생을 하고 tone_player_stop()으로 정지를 합니다.

tone_player_start()에 duration_ms을 넣어주기 때문에,

굳이 tone_player_stop()을 사용하지 않아도 됩니다.

tone_player_start()의 첫번째 인자로 tone type을 넘겨줍니다.

tone type에는 총 111개의 내장 타입이 존재합니다.


/**
 * @brief Enumeration of tone.
 * @since_tizen 2.3
 */
typedef enum
{
    TONE_TYPE_DEFAULT = 0,            /**< The default tone */
    TONE_TYPE_DTMF_0 = 0,                /**< Predefined DTMF 0 */
    TONE_TYPE_DTMF_1,                 /**< Predefined DTMF 1 */
    TONE_TYPE_DTMF_2,                /**< Predefined DTMF 2 */
    TONE_TYPE_DTMF_3,                /**< Predefined DTMF 3 */
    TONE_TYPE_DTMF_4,                /**< Predefined DTMF 4 */
    TONE_TYPE_DTMF_5,                /**< Predefined DTMF 5 */
    TONE_TYPE_DTMF_6,                /**< Predefined DTMF 6 */
    TONE_TYPE_DTMF_7,                /**< Predefined DTMF 7 */
    TONE_TYPE_DTMF_8,                /**< Predefined DTMF 8 */
    TONE_TYPE_DTMF_9,                /**< Predefined DTMF 9 */
    TONE_TYPE_DTMF_S,               /**< Predefined DTMF Star - Asterisk (*) */
    TONE_TYPE_DTMF_P,                /**< Predefined DTMF sharP (#) */
    TONE_TYPE_DTMF_A,                /**< Predefined DTMF A (A) */
    TONE_TYPE_DTMF_B,                /**< Predefined DTMF B (B) */
    TONE_TYPE_DTMF_C,                /**< Predefined DTMF C (C) */
    TONE_TYPE_DTMF_D,                /**< Predefined DTMF D (D) */
    TONE_TYPE_SUP_DIAL,     /**< Call supervisory tone, Dial tone: CEPT: 425Hz, continuous */
    TONE_TYPE_ANSI_DIAL,    /**< Call supervisory tone, Dial tone: ANSI (IS-95): 350Hz+440Hz, continuous */
    TONE_TYPE_JAPAN_DIAL,    /**< Call supervisory tone, Dial tone: JAPAN: 400Hz, continuous */
    TONE_TYPE_SUP_BUSY,    /**< Call supervisory tone, Busy: CEPT: 425Hz, 500ms ON, 500ms OFF... */
    TONE_TYPE_ANSI_BUSY,     /**< Call supervisory tone, Busy: ANSI (IS-95): 480Hz+620Hz, 500ms ON, 500ms OFF... */
    TONE_TYPE_JAPAN_BUSY,     /**< Call supervisory tone, Busy: JAPAN: 400Hz, 500ms ON, 500ms OFF... */
    TONE_TYPE_SUP_CONGESTION,   /**< Call supervisory tone, Congestion: CEPT, JAPAN: 425Hz, 200ms ON, 200ms OFF */
    TONE_TYPE_ANSI_CONGESTION,  /**< Call supervisory tone, Congestion: ANSI (IS-95): 480Hz+620Hz, 250ms ON, 250ms OFF... */
    TONE_TYPE_SUP_RADIO_ACK,   /**< Call supervisory tone, Radio path acknowledgment : CEPT, ANSI: 425Hz, 200ms ON  */
    TONE_TYPE_JAPAN_RADIO_ACK,  /**< Call supervisory tone, Radio path acknowledgment : JAPAN: 400Hz, 1s ON, 2s OFF...*/
    TONE_TYPE_SUP_RADIO_NOTAVAIL,  /**< Call supervisory tone, Radio path not available: 425Hz, 200ms ON, 200 OFF 3 bursts */
    TONE_TYPE_SUP_ERROR,    /**< Call supervisory tone, Error/Special info: 950Hz+1400Hz+1800Hz, 330ms ON, 1s OFF... */
    TONE_TYPE_SUP_CALL_WAITING,  /**< Call supervisory tone, Call Waiting: CEPT, JAPAN: 425Hz, 200ms ON, 600ms OFF, 200ms ON, 3s OFF... */
    TONE_TYPE_ANSI_CALL_WAITING,  /**< Call supervisory tone, Call Waiting: ANSI (IS-95): 440 Hz, 300 ms ON, 9.7 s OFF, (100 ms ON, 100 ms OFF, 100 ms ON, 9.7s OFF ...) */
    TONE_TYPE_SUP_RINGTONE,   /**< Call supervisory tone, Ring Tone: CEPT, JAPAN: 425Hz, 1s ON, 4s OFF... */
    TONE_TYPE_ANSI_RINGTONE,   /**< Call supervisory tone, Ring Tone: ANSI (IS-95): 440Hz + 480Hz, 2s ON, 4s OFF... */
    TONE_TYPE_PROP_BEEP,    /**< General beep: 400Hz+1200Hz, 35ms ON */
    TONE_TYPE_PROP_ACK,     /**< Proprietary tone, positive acknowledgment: 1200Hz, 100ms ON, 100ms OFF 2 bursts */
    TONE_TYPE_PROP_NACK,     /**< Proprietary tone, negative acknowledgment: 300Hz+400Hz+500Hz, 400ms ON */
    TONE_TYPE_PROP_PROMPT,    /**< Proprietary tone, prompt tone: 400Hz+1200Hz, 200ms ON  */
    TONE_TYPE_PROP_BEEP2,     /**< Proprietary tone, general double beep: twice 400Hz+1200Hz, 35ms ON, 200ms OFF, 35ms ON */
    TONE_TYPE_SUP_INTERCEPT,       /**< Call supervisory tone (IS-95), intercept tone: alternating 440 Hz and 620 Hz tones, each on for 250 ms */
    TONE_TYPE_SUP_INTERCEPT_ABBREV,    /**< Call supervisory tone (IS-95), abbreviated intercept: intercept tone limited to 4 seconds */
    TONE_TYPE_SUP_CONGESTION_ABBREV,     /**< Call supervisory tone (IS-95), abbreviated congestion: congestion tone limited to 4 seconds */
    TONE_TYPE_SUP_CONFIRM,       /**< Call supervisory tone (IS-95), confirm tone: a 350 Hz tone added to a 440 Hz tone repeated 3 times in a 100 ms on, 100 ms off cycle */
    TONE_TYPE_SUP_PIP,        /**< Call supervisory tone (IS-95), pip tone: four bursts of a 480 Hz tone (0.1 s on, 0.1 s off) */
    TONE_TYPE_CDMA_DIAL_TONE_LITE,     /**< 425Hz continuous */
    TONE_TYPE_CDMA_NETWORK_USA_RINGBACK,   /**< CDMA USA Ringback: 440Hz+480Hz 2s ON, 4000 OFF ... */
    TONE_TYPE_CDMA_INTERCEPT,      /**< CDMA Intercept tone: 440Hz 250ms ON, 620Hz 250ms ON ... */
    TONE_TYPE_CDMA_ABBR_INTERCEPT,     /**< CDMA Abbr Intercept tone: 440Hz 250ms ON, 620Hz 250ms ON */
    TONE_TYPE_CDMA_REORDER,       /**< CDMA Reorder tone: 480Hz+620Hz 250ms ON, 250ms OFF... */
    TONE_TYPE_CDMA_ABBR_REORDER,     /**< CDMA Abbr Reorder tone: 480Hz+620Hz 250ms ON, 250ms OFF repeated for 8 times */
    TONE_TYPE_CDMA_NETWORK_BUSY,     /**< CDMA Network Busy tone: 480Hz+620Hz 500ms ON, 500ms OFF continuous */
    TONE_TYPE_CDMA_CONFIRM,       /**< CDMA Confirm tone: 350Hz+440Hz 100ms ON, 100ms OFF repeated for 3 times */
    TONE_TYPE_CDMA_ANSWER,       /**< CDMA answer tone: silent tone - definition Frequency 0, 0ms ON, 0ms OFF */
    TONE_TYPE_CDMA_NETWORK_CALLWAITING,    /**< CDMA Network Callwaiting tone: 440Hz 300ms ON */
    TONE_TYPE_CDMA_PIP,        /**< CDMA PIP tone: 480Hz 100ms ON, 100ms OFF repeated for 4 times */
    TONE_TYPE_CDMA_CALL_SIGNAL_ISDN_NORMAL,   /**< ISDN Call Signal Normal tone: {2091Hz 32ms ON, 2556 64ms ON} 20 times, 2091 32ms ON, 2556 48ms ON, 4s OFF */
    TONE_TYPE_CDMA_CALL_SIGNAL_ISDN_INTERGROUP,  /**< ISDN Call Signal Intergroup tone: {2091Hz 32ms ON, 2556 64ms ON} 8 times, 2091Hz 32ms ON, 400ms OFF, {2091Hz 32ms ON, 2556Hz 64ms ON} 8times, 2091Hz 32ms ON, 4s OFF */
    TONE_TYPE_CDMA_CALL_SIGNAL_ISDN_SP_PRI,   /**< ISDN Call Signal SP PRI tone:{2091Hz 32ms ON, 2556 64ms ON} 4 times 2091Hz 16ms ON, 200ms OFF, {2091Hz 32ms ON, 2556Hz 64ms ON} 4 times, 2091Hz 16ms ON, 200ms OFF */
    TONE_TYPE_CDMA_CALL_SIGNAL_ISDN_PAT3,   /**< SDN Call sign PAT3 tone: silent tone */
    TONE_TYPE_CDMA_CALL_SIGNAL_ISDN_PING_RING,  /**< ISDN Ping Ring tone: {2091Hz 32ms ON, 2556Hz 64ms ON} 5 times 2091Hz 20ms ON */
    TONE_TYPE_CDMA_CALL_SIGNAL_ISDN_PAT5,   /**< ISDN Pat5 tone: silent tone */
    TONE_TYPE_CDMA_CALL_SIGNAL_ISDN_PAT6,   /**< ISDN Pat6 tone: silent tone */
    TONE_TYPE_CDMA_CALL_SIGNAL_ISDN_PAT7,   /**< ISDN Pat7 tone: silent tone */
    TONE_TYPE_CDMA_HIGH_L,       /**< TONE_CDMA_HIGH_L tone: {3700Hz 25ms, 4000Hz 25ms} 40 times 4000ms OFF, Repeat .... */
    TONE_TYPE_CDMA_MED_L,       /**< TONE_CDMA_MED_L tone: {2600Hz 25ms, 2900Hz 25ms} 40 times 4000ms OFF, Repeat .... */
    TONE_TYPE_CDMA_LOW_L,       /**< TONE_CDMA_LOW_L tone: {1300Hz 25ms, 1450Hz 25ms} 40 times, 4000ms OFF, Repeat .... */
    TONE_TYPE_CDMA_HIGH_SS,       /**< CDMA HIGH SS tone: {3700Hz 25ms, 4000Hz 25ms} repeat 16 times, 400ms OFF, repeat .... */
    TONE_TYPE_CDMA_MED_SS,       /**< CDMA MED SS tone: {2600Hz 25ms, 2900Hz 25ms} repeat 16 times, 400ms OFF, repeat .... */
    TONE_TYPE_CDMA_LOW_SS,       /**< CDMA LOW SS tone: {1300z 25ms, 1450Hz 25ms} repeat 16 times, 400ms OFF, repeat .... */
    TONE_TYPE_CDMA_HIGH_SSL,       /**< CDMA HIGH SSL tone: {3700Hz 25ms, 4000Hz 25ms} 8 times, 200ms OFF, {3700Hz 25ms, 4000Hz 25ms} repeat 8 times, 200ms OFF, {3700Hz 25ms, 4000Hz 25ms} repeat 16 times, 4000ms OFF, repeat ... */
    TONE_TYPE_CDMA_MED_SSL,       /**< CDMA MED SSL tone: {2600Hz 25ms, 2900Hz 25ms} 8 times, 200ms OFF, {2600Hz 25ms, 2900Hz 25ms} repeat 8 times, 200ms OFF, {2600Hz 25ms, 2900Hz 25ms} repeat 16 times, 4000ms OFF, repeat ... */
    TONE_TYPE_CDMA_LOW_SSL,       /**< CDMA LOW SSL tone: {1300Hz 25ms, 1450Hz 25ms} 8 times, 200ms OFF, {1300Hz 25ms, 1450Hz 25ms} repeat 8 times, 200ms OFF, {1300Hz 25ms, 1450Hz 25ms} repeat 16 times, 4000ms OFF, repeat ... */
    TONE_TYPE_CDMA_HIGH_SS_2,      /**< CDMA HIGH SS2 tone: {3700Hz 25ms, 4000Hz 25ms} 20 times, 1000ms OFF, {3700Hz 25ms, 4000Hz 25ms} 20 times, 3000ms OFF, repeat .... */
    TONE_TYPE_CDMA_MED_SS_2,       /**< CDMA MED SS2 tone: {2600Hz 25ms, 2900Hz 25ms} 20 times, 1000ms OFF, {2600Hz 25ms, 2900Hz 25ms} 20 times, 3000ms OFF, repeat .... */
    TONE_TYPE_CDMA_LOW_SS_2,       /**< CDMA LOW SS2 tone: {1300Hz 25ms, 1450Hz 25ms} 20 times, 1000ms OFF, {1300Hz 25ms, 1450Hz 25ms} 20 times, 3000ms OFF, repeat .... */
    TONE_TYPE_CDMA_HIGH_SLS,       /**< CDMA HIGH SLS tone: {3700Hz 25ms, 4000Hz 25ms} 10 times, 500ms OFF, {3700Hz 25ms, 4000Hz 25ms} 20 times, 500ms OFF, {3700Hz 25ms, 4000Hz 25ms} 10 times, 3000ms OFF, REPEAT */
    TONE_TYPE_CDMA_MED_SLS,       /**< CDMA MED SLS tone: {2600Hz 25ms, 2900Hz 25ms} 10 times, 500ms OFF, {2600Hz 25ms, 2900Hz 25ms} 20 times, 500ms OFF, {2600Hz 25ms, 2900Hz 25ms} 10 times, 3000ms OFF, REPEAT */
    TONE_TYPE_CDMA_LOW_SLS,       /**< CDMA LOW SLS tone: {1300Hz 25ms, 1450Hz 25ms} 10 times, 500ms OFF, {1300Hz 25ms, 1450Hz 25ms} 20 times, 500ms OFF, {1300Hz 25ms, 1450Hz 25ms} 10 times, 3000ms OFF, REPEAT */
    TONE_TYPE_CDMA_HIGH_S_X4,      /**< CDMA HIGH S X4 tone: {3700Hz 25ms, 4000Hz 25ms} 10 times, 500ms OFF, {3700Hz 25ms, 4000Hz 25ms} 10 times, 500ms OFF, {3700Hz 25ms, 4000Hz 25ms} 10 times, 500ms OFF, {3700Hz 25ms, 4000Hz 25ms} 10 times, 2500ms OFF, REPEAT.... */
    TONE_TYPE_CDMA_MED_S_X4,       /**< CDMA MED S X4 tone: {2600Hz 25ms, 2900Hz 25ms} 10 times, 500ms OFF, {2600Hz 25ms, 2900Hz 25ms} 10 times, 500ms OFF, {2600Hz 25ms, 2900Hz 25ms} 10 times, 500ms OFF, {2600Hz 25ms, 2900Hz 25ms} 10 times, 2500ms OFF, REPEAT.... */
    TONE_TYPE_CDMA_LOW_S_X4,       /**< CDMA LOW S X4 tone: {2600Hz 25ms, 2900Hz 25ms} 10 times, 500ms OFF, {2600Hz 25ms, 2900Hz 25ms} 10 times, 500ms OFF, {2600Hz 25ms, 2900Hz 25ms} 10 times, 500ms OFF, {2600Hz 25ms, 2900Hz 25ms} 10 times, 2500ms OFF, REPEAT.... */
    TONE_TYPE_CDMA_HIGH_PBX_L,      /**< CDMA HIGH PBX L: {3700Hz 25ms, 4000Hz 25ms}20 times, 2000ms OFF, REPEAT.... */
    TONE_TYPE_CDMA_MED_PBX_L,      /**< CDMA MED PBX L: {2600Hz 25ms, 2900Hz 25ms}20 times, 2000ms OFF, REPEAT.... */
    TONE_TYPE_CDMA_LOW_PBX_L,      /**< CDMA LOW PBX L: {1300Hz 25ms,1450Hz 25ms}20 times, 2000ms OFF, REPEAT.... */
    TONE_TYPE_CDMA_HIGH_PBX_SS,      /**< CDMA HIGH PBX SS tone: {3700Hz 25ms, 4000Hz 25ms} 8 times 200 ms OFF, {3700Hz 25ms 4000Hz 25ms}8 times, 2000ms OFF, REPEAT.... */
    TONE_TYPE_CDMA_MED_PBX_SS,      /**< CDMA MED PBX SS tone: {2600Hz 25ms, 2900Hz 25ms} 8 times 200 ms OFF, {2600Hz 25ms 2900Hz 25ms}8 times, 2000ms OFF, REPEAT.... */
    TONE_TYPE_CDMA_LOW_PBX_SS,      /**< CDMA LOW PBX SS tone: {1300Hz 25ms, 1450Hz 25ms} 8 times 200 ms OFF, {1300Hz 25ms 1450Hz 25ms}8 times, 2000ms OFF, REPEAT.... */
    TONE_TYPE_CDMA_HIGH_PBX_SSL,      /**< CDMA HIGH PBX SSL tone:{3700Hz 25ms, 4000Hz 25ms} 8 times 200ms OFF, {3700Hz 25ms, 4000Hz 25ms} 8 times, 200ms OFF, {3700Hz 25ms, 4000Hz 25ms} 16 times, 1000ms OFF, REPEAT.... */
    TONE_TYPE_CDMA_MED_PBX_SSL,      /**< CDMA MED PBX SSL tone:{2600Hz 25ms, 2900Hz 25ms} 8 times 200ms OFF, {2600Hz 25ms, 2900Hz 25ms} 8 times, 200ms OFF, {2600Hz 25ms, 2900Hz 25ms} 16 times, 1000ms OFF, REPEAT.... */
    TONE_TYPE_CDMA_LOW_PBX_SSL,      /**< CDMA LOW PBX SSL tone:{1300Hz 25ms, 1450Hz 25ms} 8 times 200ms OFF, {1300Hz 25ms, 1450Hz 25ms} 8 times, 200ms OFF, {1300Hz 25ms, 1450Hz 25ms} 16 times, 1000ms OFF, REPEAT.... */
    TONE_TYPE_CDMA_HIGH_PBX_SLS,      /**< CDMA HIGH PBX SLS tone:{3700Hz 25ms, 4000Hz 25ms} 8 times 200ms OFF, {3700Hz 25ms, 4000Hz 25ms} 16 times, 200ms OFF, {3700Hz 25ms, 4000Hz 25ms} 8 times, 1000ms OFF, REPEAT....  */
    TONE_TYPE_CDMA_MED_PBX_SLS,      /**< CDMA MED PBX SLS tone:{2600Hz 25ms, 2900Hz 25ms} 8 times 200ms OFF, {2600Hz 25ms, 2900Hz 25ms} 16 times, 200ms OFF, {2600Hz 25ms, 2900Hz 25ms} 8 times, 1000ms OFF, REPEAT.... */
    TONE_TYPE_CDMA_LOW_PBX_SLS,      /**< CDMA LOW PBX SLS tone:{1300Hz 25ms, 1450Hz 25ms} 8 times 200ms OFF, {1300Hz 25ms, 1450Hz 25ms} 16 times, 200ms OFF, {1300Hz 25ms, 1450Hz 25ms} 8 times, 1000ms OFF, REPEAT.... */
    TONE_TYPE_CDMA_HIGH_PBX_S_X4,     /**< CDMA HIGH PBX X S4 tone: {3700Hz 25ms 4000Hz 25ms} 8 times, 200ms OFF, {3700Hz 25ms 4000Hz 25ms} 8 times, 200ms OFF, {3700Hz 25ms 4000Hz 25ms} 8 times, 200ms OFF, {3700Hz 25ms 4000Hz 25ms} 8 times, 800ms OFF, REPEAT... */
    TONE_TYPE_CDMA_MED_PBX_S_X4,      /**< CDMA MED PBX X S4 tone: {2600Hz 25ms 2900Hz 25ms} 8 times, 200ms OFF, {2600Hz 25ms 2900Hz 25ms} 8 times, 200ms OFF, {2600Hz 25ms 2900Hz 25ms} 8 times, 200ms OFF, {2600Hz 25ms 2900Hz 25ms} 8 times, 800ms OFF, REPEAT... */
    TONE_TYPE_CDMA_LOW_PBX_S_X4,      /**< CDMA LOW PBX X S4 tone: {1300Hz 25ms 1450Hz 25ms} 8 times, 200ms OFF, {1300Hz 25ms 1450Hz 25ms} 8 times, 200ms OFF, {1300Hz 25ms 1450Hz 25ms} 8 times, 200ms OFF, {1300Hz 25ms 1450Hz 25ms} 8 times, 800ms OFF, REPEAT... */
    TONE_TYPE_CDMA_ALERT_NETWORK_LITE,    /**< CDMA Alert Network Lite tone: 1109Hz 62ms ON, 784Hz 62ms ON, 740Hz 62ms ON 622Hz 62ms ON, 1109Hz 62ms ON */
    TONE_TYPE_CDMA_ALERT_AUTOREDIAL_LITE,   /**< CDMA Alert Auto Redial tone: {1245Hz 62ms ON, 659Hz 62ms ON} 3 times, 1245 62ms ON */
    TONE_TYPE_CDMA_ONE_MIN_BEEP,      /**< CDMA One Min Beep tone: 1150Hz+770Hz 400ms ON */
    TONE_TYPE_CDMA_KEYPAD_VOLUME_KEY_LITE,   /**< CDMA KEYPAD Volume key lite tone: 941Hz+1477Hz 120ms ON */
    TONE_TYPE_CDMA_PRESSHOLDKEY_LITE,    /**< CDMA PRESSHOLDKEY LITE tone: 587Hz 375ms ON, 1175Hz 125ms ON */
    TONE_TYPE_CDMA_ALERT_INCALL_LITE,     /**< CDMA ALERT INCALL LITE tone: 587Hz 62ms, 784 62ms, 831Hz 62ms, 784Hz 62ms, 1109 62ms, 784Hz 62ms, 831Hz 62ms, 784Hz 62ms */
    TONE_TYPE_CDMA_EMERGENCY_RINGBACK,    /**< CDMA EMERGENCY RINGBACK tone: {941Hz 125ms ON, 10ms OFF} 3times 4990ms OFF, REPEAT... */
    TONE_TYPE_CDMA_ALERT_CALL_GUARD,    /**< CDMA ALERT CALL GUARD tone: {1319Hz 125ms ON, 125ms OFF} 3 times */
    TONE_TYPE_CDMA_SOFT_ERROR_LITE,     /**< CDMA SOFT ERROR LITE tone: 1047Hz 125ms ON, 370Hz 125ms */
    TONE_TYPE_CDMA_CALLDROP_LITE,     /**< CDMA CALLDROP LITE tone: 1480Hz 125ms, 1397Hz 125ms, 784Hz 125ms */
    TONE_TYPE_CDMA_NETWORK_BUSY_ONE_SHOT,   /**< CDMA_NETWORK_BUSY_ONE_SHOT tone: 425Hz 500ms ON, 500ms OFF */
    TONE_TYPE_CDMA_ABBR_ALERT,      /**< CDMA_ABBR_ALERT tone: 1150Hz+770Hz 400ms ON */
    TONE_TYPE_CDMA_SIGNAL_OFF,    /**< CDMA_SIGNAL_OFF - silent tone */
    TONE_TYPE_USER_DEFINED_LOW_FRE,                    /**< User Defined Tone: 100Hz continuous */
    TONE_TYPE_USER_DEFINED_MED_FRE,                    /**< User Defined Tone: 200Hz continuous */
    TONE_TYPE_USER_DEFINED_HIGH_FRE                   /**< User Defined Tone: 300Hz continuous */
} tone_type_e;


Call과 관련된 온갖 종류의 톤이 명시되어 있습니다.


static Eina_Bool _clk_beep_play_cb(void *data)
{
    tone_player_start(TONE_TYPE_PROP_ACK, SOUND_TYPE_ALARM, 400, NULL);
    return ECORE_CALLBACK_RENEW;
}


위의 코드는 clock 앱에서 sound를 제어하는 부분에서 가져왔습니다.

duration_ms를 400으로 주고 있기에 400ms가 지나면 저절로 멈춥니다.

따라서 따로 tone_player_stop()을 사용할 필요가 없습니다.


tone_player_stop()은,

버튼을 누르면 재생하고 손을 떼면 정지하는 상황에서 사용하면 됩니다.


tone play는 111가지 타입 중 사용목적에 맞는 톤을 고르는 것이 중요합니다.

enum 값으로 의미를 확인하고 실제로 소리를 들어본 후 루틴에 반영하세요.


tone player를 위한 샘플앱이 있습니다.

New > Tizen Native Project > Online Sample > Multimedia > Media

Tizen 2.4 IDE에서 위의 경로로 샘플앱을 생성하세요.


static const tone_type_e _tone_list[] = { 
    TONE_TYPE_DTMF_0,
    TONE_TYPE_DTMF_1,
    TONE_TYPE_DTMF_2,
    TONE_TYPE_DTMF_3,
    TONE_TYPE_DTMF_4,
    TONE_TYPE_DTMF_5,
    TONE_TYPE_DTMF_6,
    TONE_TYPE_DTMF_7,
    TONE_TYPE_DTMF_8,
    TONE_TYPE_DTMF_9,
    TONE_TYPE_DTMF_S,
    TONE_TYPE_DTMF_P,
    TONE_TYPE_DTMF_A,
    TONE_TYPE_DTMF_B,
    TONE_TYPE_DTMF_C,
    TONE_TYPE_DTMF_D
};


위의 tone type을 버튼을 눌러 하나씩 확인할 수 있습니다.

Media/src/audio/src/tone_player_view.c를 참고하시면 됩니다.


그럼 오늘은 이만 마치겠습니다.

좋은 하루 보내세요~


끝_


* References

https://developer.tizen.org/dev-guide/2.4.0/org.tizen.native.mobile.apireference/group__CAPI__MEDIA__TONE__PLAYER__MODULE.html

  1. 2015.12.01 00:29

    비밀댓글입니다


안녕하세요, 타이젠 개발자 윤진입니다.


지난 포스팅에서는 sound manager의 volume 부분을 살펴보았는데요,

[Tizen] 타이젠 개발, Sound manager로 볼륨을 조절하기

이번 포스팅에서는 sound manager의 session 부분을 보도록 하겠습니다.


세션 API


session과 관련하여 공개된 함수는 위의 10개가 전부입니다.

각각의 함수를 살펴보기에 앞서,

session type을 하나씩 먼저 언급해보도록 하겠습니다.



플랫폼 개발자 입장에서 살펴보면,

Media, Alarm, Notification은 제법 눈에 익습니다.

플랫폼에 이미 탑재되어 여기저기서 사용하고 있는 세션들이라 그렇겠지요.

위의 세 세션은 이전 볼륨 포스트에서도 나왔습니다.


SOUND_TYPE_MEDIA
Sound type for media

SOUND_TYPE_ALARM
Sound type for alarm

SOUND_TYPE_NOTIFICATION
Sound type for notifications


미디어나 알람은 누구나 세션을 열어서 사용할 수 있고,

더불어 해당 세션을 위한 볼륨도 조절할 수 있습니다.

노티를 위한 세션은 통상 시스템 레벨의 앱에서 알림을 목적으로 사용합니다.

외부 개발자들도 알림을 목적으로만 사용하는게 좋겠네요.


Emergency는 어느 세션보다 우선하여 동작하는 세션입니다.

Emergency 세션 위로 다른 세션이 포개질 수 없습니다.

Emergency는 silent도 되지 않기 때문에 함부로 사용하면 안되겠죠?


VoIP는 Voice Over IP를 위해 새롭게 추가된 세션입니다.

볼륨에도 아래와 같이 VOIP를 위한 타입이 추가된 상태입니다.


SOUND_TYPE_VOIP
Sound type for voip (Since 2.4)


VoIP를 위한 세션까지 구비되어 있으니,

VoIP 서비스 업체들은 어서 타이젠으로 조인해주세요 :)

그외에 볼륨 타입에는 존재하지만 세션에는 노출되지 않은 세션이 있습니다.


SOUND_TYPE_SYSTEM
Sound type for system

SOUND_TYPE_RINGTONE
Sound type for ringtones (Since 2.4)

SOUND_TYPE_CALL
Sound type for call (Since 2.4)

SOUND_TYPE_VOICE
Sound type for voice


위의 세션을 살펴보면 몇가지 알 수 있는 사실이 있습니다.

요금 과금과 직접적으로 관련된 Call 기능은 3rd party가 개발할 수 없다는 것이지요.

사용자 '돈'과 직접적으로 만나는 부분은 아무래도 조심스럽습니다.

단순히 기존 아키텍쳐를 바꾸고 몇몇 API만 공개한다고 될 수준은 아닙니다.


그리고 System 세션은 3rd party에게 열 이유가 없습니다.

System은 플랫폼에서 독점적으로 사용하고 있습니다.

외부에서는 볼륨을 조절하는 것으로 만족해야겠네요.


클락앱의 알람을 설정하는 코드를 살짝 엿보겠습니다.

static bool ring_app_create(void *data)
{
    retvm_if(!data, FALSE, "data null");
    int nErr = SUCCESS;
    struct appdata *ad = (struct appdata *)data;

    ad->is_create = EINA_FALSE;
    nErr = alarmdb_init(NULL);
    retvm_if(SUCCESS != nErr, FALSE, "alarmdb_init failed! return=%d\n",
         nErr);
    nErr = alarmmgr_init(PKGNAME);
    retvm_if(SUCCESS != nErr, FALSE, "alarmmgr_init failed! return=%d", nErr);
    //mm
    sound_manager_set_session_type(SOUND_SESSION_TYPE_ALARM);
    // 
    ring_util_state_get(ad);
    nErr = alarmmgr_set_cb(_ring_mgr_cb_func, ad);
    retvm_if(SUCCESS != nErr, FALSE, "alarmmgr_set_cb failed! return=%d", nErr);
    ad->motion_sensor_handle = -1;
    //_ring_init_motion_sensor(ad);
    return TRUE;
}


클락앱은 알람을 설정할 수 있는 기능이 있는데요,

알람을 설정할 때 sound_manager_set_session_type()을 이용하여 세션을 설정합니다.


Media session은 sound_manager_set_media_session_option()을 이용하여,

- 미디어 세션 시작시 다른 세션과 Mix할 것인지 다른 세션을 Pause시킬지

- 미디어 세션 플레이 중에 인터럽트를 허용할 것인지

두가지 옵션을 설정할 수 있도록 준비되어 있습니다.

아래의 enum을 참고하시면 보다 명확하게 이해하실 수 있을겁니다.



보통은 하나의 API가 하나의 옵션을 지정하게 되어있는데요,

Session 옵션을 지정하는 API는 두가지 옵션을 지정하게 되어있습니다.

Media session의 옵션을 모두 다루려고 그렇게 설계한 것일까요?



하지만, 안타깝게도 media session 옵션용 API가 하나 더 생겨납니다.

위의 enum은 sound_manager_set_media_session_resumption_option()에서 사용합니다.

Resumption option은 Media 세션이 다른 세션에 의해 중지되었을때 Resume 정책을 지정합니다.

- 시스템 정책에 따라 세션을 resume하거나

- 시스템 정책 + 이 세션을 중지한 미디어 세션이 중지될 때

위의 두가지 정책 중에 하나를 선택할 수 있습니다.


미디어 세션은 여타의 세션들 중에 우선순위가 가장 낮은 부류에 속하기 때문에,

다른 세션들에 의해 쉽게 interrupt 될 수 있습니다.

그래서 resume에 대한 부분도 미리 고려해줄 필요가 있습니다.


sound_manager_set_session_interrupted_cb() 함수로 인터럽트 상황을 통제할 수 있습니다.

우선 인터럽트 상황을 처리할 콜백함수를 위의 함수로 등록해줍니다.

그리고 인터럽트 상황이 발생하면 콜백함수가 불리면서 아래 enum 값을 콜백함수로 넘겨줍니다.


각각의 인터럽트 상황에 맞게 동작을 처리해줍니다.

미디어를 재생하고 있는데 헤드폰이 뽑혔다면 어떻게 해야할까요?

일반적으로는 재생이 중지됩니다. :)


Sound manager의 세션은 이 정도로 정리하도록 하겠습니다.

다음 포스팅에서는 sound의 다른 부분을 살펴보도록 하겠습니다.


그럼 좋은 하루 보내세요~

끝_



* References

https://developer.tizen.org/dev-guide/2.4.0/org.tizen.native.mobile.apireference/group__CAPI__MEDIA__SOUND__MANAGER__SESSION__MODULE.html



안녕하세요, 타이젠 개발자 윤진입니다.


앱 개발을 하려면, 플랫폼에서 제공하는 다양한 요소를 사용해야합니다.

앞으로 몇 개의 포스팅에 걸쳐서 '소리'와 관련된 부분을 다뤄보도록 하겠습니다.

첫 포스팅에서는 가볍게 워밍업 하는 기분으로 '볼륨'을 이야기해보죠.


2015년 11월 현재,

Tizen 2.4가 최신 버전이기 때문에, 2.4를 기준으로 설명하겠습니다.

Tizen 2.4가 올라간 타겟은 두 대가 있는데요,

- 지난 10월에 인도에서 출시된 Z3

- 타이젠 데브랩 행사에서 사용하고 있는 TM1

필요하면 위의 타겟들과 에뮬레이터를 이용하여 포스팅하도록 하겠습니다.


볼륨 API를 살펴보기에 앞서 Z3에 올라가 있는 볼륨 앱을 실행해보도록 해보죠.

근데... Z3를 어디에 뒀는지 통 찾을 수가 없네요;

우선 Tizen 2.4 에뮬을 띄워 볼륨앱을 실행해보도록 하겠습니다;



볼륨앱은 단순하며 직관적으로 조작할 수 있는 UI를 가지고 있습니다.

하드키인 볼륨키나 화면의 슬라이더를 이용하여 볼륨을 조절할 수 있도록 지원합니다.

플랫폼에서는 볼륨앱이 volume API를 가장 적극적으로 사용하고 있겠죠?


Volume API


2.4 기준으로 외부에 노출되어 있는 볼륨 API는 위의 8개 뿐입니다.

볼륨 조작을 위해서는 사운드 타입정도만 인지하면 되기때문에 API가 단촐합니다.

실제 볼륨앱 소스를 보면서 위의 API가 어떤 식으로 활용되고 있는지 보겠습니다.


볼륨앱의 소스는 당연히 공개되어 있는데요,

공개된 소스가 플랫폼 2.4 소스와 완벽하게 일치하진 않겠지만(계속 진화하고 있으므로),

volume을 제어하는 control 루틴을 변화가 적으니 그 코드를 그대로 봐도 괜찮을겁니다.

볼륨 소스를 git으로 다운로드 받으시려면 아래 repo.를 이용하세요.

repo. : git://review.tizen.org/apps/core/preloaded/volume-app

branch : tizen


볼륨앱에는 하나의 슬라이더가 나오는데요,

볼륨앱을 실행하는 시점에 활성화된 볼륨타입을 가져와서 화면에 보여줍니다.



sound_manager_get_current_sound_type()으로 활성화되어 있는 사운드 타입을 가져오면,

바로 위에 명시된 8개의 enum 값 중 하나를 얻어올 수 있습니다.

2.4에는 ringtones, call, voip와 같이 콜과 관련된 사운드 타입이 추가되었죠.

타이젠 플랫폼이 3rd party를 위해 call 관련 API, 특히 VoIP를 정비하고 있나보네요.


sound_type_e volume_sound_sound_manager_type_get(void)
{
    int ret = 0;
    sound_type_e sound_type = -1;

    ret = sound_manager_get_current_sound_type(&sound_type);
    _D("ret: %d, sound type: %d", ret, sound_type);
    switch (ret) {
    case SOUND_MANAGER_ERROR_NONE:
        _D("Error none");
        break;
    case SOUND_MANAGER_ERROR_NO_PLAYING_SOUND:
        _D("NO playing sound");
        sound_type = SOUND_TYPE_RINGTONE;
        break;
    default:
        _E("Failed to get sound type : %d", ret);
        sound_type = SOUND_TYPE_RINGTONE;
        return sound_type;
    }  

    if(sound_type == SOUND_TYPE_SYSTEM)
        sound_type = SOUND_TYPE_RINGTONE;

    return sound_type;
}


볼륨앱에서는 ringtones를 기본으로 설정하고 있습니다.

사용자가 홈화면에서 볼륨키를 누르면 링톤의 음량을 조절할 수 있겠네요.


그리고 sound_manager_get_max_volume()과 sound_manager_get_volume()을 이용하여,

슬라이더의 단계와 활성화된 영역을 표시합니다.


int volume_sound_sound_manager_step_get(sound_type_e type)
{
    _D("volume sound manager step get");
    int ret = -1, step = 0;

    ret = sound_manager_get_max_volume(type, &step);
    retvm_if(ret < 0, -1, "Failed to get step");

    sound_info.sound_step = step;

    return step;
}

int volume_sound_sound_manager_volume_get(sound_type_e type)
{
    int ret = -1, val = 0;
    ret = sound_manager_get_volume(type, &val);
    retvm_if(ret < 0, -1, "Failed to get volume");
    return val;
}


위의 volume_sound_sound_manager_step_get()에서,

sound_manager_get_max_volume()을 이용하여 전체 단계를 얻고 있네요.

그리고 volume_sound_sound_manager_volume_get()에서,

sound_manager_get_volume()으로 현재 단계를 얻고 있습니다.


그리고 sound_manager_set_volume()으로 현재 설정된 사운드 타입의 볼륨을 조절합니다.

sound_manager_set_volume_changed_cb()으로 등록한 콜백에서는 볼륨이 변할때마다,

화면을 다시 그리고 볼륨값을 관리하고 있네요.

이 부분 소스는 따로 언급하지 않겠습니다.


사실 sound manager의 볼륨 API에는 낯선 함수가 하나 있습니다.

sound_manager_unset_current_sound_type() 함수인데요,

이 함수는 sound_manager_set_current_sound_type()과 짝을 이루는 함수입니다.

set이 있으니 당연히 unset도 존재하는 것이지요.

하지만, 플랫폼에서는 위 함수를 사용하는 부분을 찾지 못했습니다.


볼륨앱의 경우,

sound_manager_get_current_sound_type()으로 현재 사운드타입을 얻어서 볼륨을 조절하는데요,

위의 unset 함수를 누군가 사용한다면 current sound type을 못 가져오겠지요.

물론 볼륨앱은 예외처리는 되어 있습니다만,

실제 유저시나리오 중에 unset이 필요한 경우가 있는지 모르겠습니다.

볼륨키를 컨트롤하려면 어느 상황에서나 사운드타입이 결정되어 있어야 하지 않나 싶기도 하네요.

(이 부분은 제 지식이 짧아서 좀 더 알아봐야겠습니다)


이것으로 볼륨 관련 포스팅은 마치겠습니다.

다음 포스팅은 좀 더 흥미로운 부분을 다뤄보도록 하겠습니다.


그럼 좋은 하루 보내세요~

끝_


* References

https://developer.tizen.org/dev-guide/2.4.0/org.tizen.native.mobile.apireference/group__CAPI__MEDIA__SOUND__MANAGER__VOLUME__MODULE.html

https://developer.tizen.org/community/code-snippet/native-code-snippet/set-volume-level?tab=all

https://developer.tizen.org/community/code-snippet/native-code-snippet/track-volume-changes?tab=all

https://developer.tizen.org/community/code-snippet/native-code-snippet/get-maximum-volume-level-given-sound-type.?tab=all

https://developer.tizen.org/community/code-snippet/native-code-snippet/get-current-volume-level?tab=all


안녕하세요, 타이젠 개발자 윤진입니다.


본 포스팅은 이틀에 걸쳐 졸음과 싸워가며 작성한 포스팅입니다.

오탈자가 있을 수 있으니 너그러운 맘으로 지적질(?) 부탁드립니다;


사실 이전 포스팅에서도 타이젠 개발환경의 핵심툴인 sdb를 언급한 적이 있습니다.

- sdb 설치하기 : [Tizen] 우분투에 타이젠 플랫폼 툴인 gbs & sdb 설치해보기

- sdb 사용하기 with Gear S2 : [Tizen/Gear S2] 타이젠 기어S2와 호스트 PC 연결하기


하지만 하루에도 수십차례 이용하는 sdb의 주요 기능에 대해 다룬 적이 없더군요.

어쩌면 지금 이 시간에도 수많은 타이젠 개발자들이 sdb를 이용하고 있을텐데요.

이 포스팅에서는 타이젠 개발자들이 주로 사용하는 sdb 기능을 설명하도록 하겠습니다.


sdb는 개발시스템과 디바이스(혹은 에뮬)을 연결하여 사용할 수 있도록 도와주는 툴입니다.

개발시스템과 에뮬 혹은 디바이스 혹은 에뮬과 디바이스를 동시에 연결할 수도 있지요.

파일을 주고 받고, 원격 쉘 접속을 위해 sdb를 사용하고 있습니다.


이런 sdb를 사용하기 위해서는 2가지 전제조건이 있습니다.


전제 1. 당연히, sdb를 설치하셔야겠지요.

sdb는 기본적으로 Tizen SDK와 함께 설치됩니다.

따라서 Tizen SDK를 설치하셨다면,

tizen-sdk/tools/sdb를 찾으실 수 있을겁니다.

만약 SDK 없이 sdb 툴만 리눅스환경에서 따로 받고 싶으시면 위에 언급한 포스팅을 참고해주세요.


전제 2. sdb로 붙이려는 디바이스의 debug 모드를 "On" 하셔야합니다.

디바이스에서 debug 모드를 켜놓지 않으면 sdb를 붙일 수 없지요.

타이젠 플랫폼에서는 Home > Settings > Device Info. > USB Debugging에서 설정하고,

타이젠 상품 Gear 시리즈에서는 Apps > Settings > Gear Info. > Debugging에서 설정하며,

타이젠 상품 Z1, Z3에서는 아래 포스팅을 참고해서 debug 모드를 설정하실 수 있습니다.

[Tizen] 타이젠 Z1에 개발자모드 메뉴가 숨겨져 있는 까닭은?


전제조건을 모두 만족하셨다면 이제 sdb 명령어를 살펴볼 차례입니다.

sdb 명령어는 도스나 리눅스 쉘에서 직접 사용할 수 있습니다.


sdb [option] <command> [parameters]


option에는 총 3가지 명령어가 있습니다.

옵션 1. "-d" 디바이스와 연결할 때 사용하는 명령어입니다.

개발시스템과 연결한 장치가 여러개 있을 경우,

그 중 USB와 직접 연결된 디바이스에 -d 옵션으로 접속할 수 있습니다.


옵션 2. "-e" 에뮬레이터와 연결할 때 사용하는 명령어입니다.

개발시스템과 연결한 장치가 여러개 있을 경우,

그 중 에뮬레이터에 -e 옵션으로 접속할 수 있습니다.

   

옵션 3. "-s" 시리얼넘버로 디바이스 혹은 에뮬에 접속할 수 있습니다.

시리얼 넘버는 sdb get-serialno 명령어로 얻을 수 있는데요,

앱개발할 때 사용한 경험이 거의 없군요 :)


위의 명령어 세가지는 말 그대로 옵션입니다.

개발시스템에 에뮬레이터와 디바이스가 모두 연결되어 있고,

둘 중 하나를 번걸아가며 접속할 때 유용하게 사용할 수 있습니다.

에뮬과 디바이스 중 하나만 접속이 되어 있다면,

옵션을 사용하지 않아도 접속된 에뮬 혹은 디바이스에 알아서 접속해줍니다.


command에는 다수의 유용한 명령어가 있습니다.

명령어 1. "root" <on | off>

root 명령어는 sdb로 에뮬 혹은 디바이스에 루트 권한으로 접속하게 해줍니다.

에뮬이나 플랫폼 바이너리가 탑재된 TM1 시료에서 사용할 수 있습니다.

Z1, Z3, Gear1, Gear2와 같은 상품에서는 root 권한을 얻을 수 없습니다.


명령어 2. "connect" <host>[:<port>]

connect는 Gear S2를 연결할 때 사용합니다.

이 명령어는 아래 포스팅을 참고해주세요.

[Tizen/Gear S2] 타이젠 기어S2와 호스트 PC 연결하기


명령어 3. "shell"

shell 명령어는 리모트쉘로 에뮬 혹은 디바이스에 접속할 수 있게 해줍니다.

쉘 명령어로 장치에 접속을 한뒤,

플랫폼에 설치된 다양한 명령어를 사용하여 장치의 상태를 확인할 수 있습니다.

top 혹은 ps를 사용하여 장치상태를 확인해보세요 :)


굳이 리모트 쉘에 접속할 필요없이,

쉘명령어만 한 번 사용하여 결과를 보고 싶다면,

sdb shell <명령어> 형식을 사용하면 됩니다.

예를 들어 ps 상황만 체크하고 싶다면,

sdb shell ps를 치면 쉘없이 ps 내용이 바로 출력됩니다.


명령어 4. "install" <pkg_path>

개발시스템에서 빌드한 패키지를 remote로 복사한 후 설치합니다.

패키지만 가지고 있는 경우,

sdb 명령어를 통해 쉽게 복사 & 설치할 수 있겠네요.


명령어 5. "uninstall" <pkg_id>

remote에서 패키지를 삭제할 때 사용할 수 있습니다.

이 때 pkg_id를 정확하게 알아야합니다.

자신이 삭제할 패키지의 ID는 정확히 알아야겠지요?


명령어 6. "push" <local> <remote>

개발시스템에서 빌드한 패키지를 에뮬 혹은 디바이스에 보낼 때 주로 사용합니다.

패키지 뿐만 아니라 각종 파일을 넘기는데 사용하지요.

<local>에는 개발시스템에서 보낼 파일을 기입합니다.

<remote>에는 파일을 받을 장소를 선택합니다.

만약 파일을 받을 디렉토리가 없다면 제대로 푸시되지 않을 수 있으니 미리 만들어주세요.

# sdb push file_to_push.txt /home/developer

위와 같이 file_to_push.txt 파일을 /home/developer 위치에 넣을 수 있습니다.


명령어 7. "pull" <remote> [<local>]

push와 상반되게 리모트 시스템에 있는 파일을 개발시스템으로 가져올 수 있습니다.

<remote>에는 리모트 시스템에 있는 파일을 절대경로로 적어주면 됩니다.

[<local>]을 적지 않으면 현재 디렉토리로 파일을 가져옵니다.


명령어 8. "kill-server" & "start-server"

sdb로 제대로 접속이 안될 경우,

sdb server를 죽였다가 다시 살립니다.

개발시스템과 에뮬 혹은 디바이스가 대부분 제대로 잘 붙는데요,

아주 간헐적으로 알 수 없는 이유 때문에 잘 안붙을 때가 있습니다.

그럴때 서버를 죽였다가 살려보세요. :)


명령어 9. "get-serialno" & "devices"

현재 접속된 디바이스 혹은 에뮬에 대한 시리얼 넘버를 알려줍니다.

여기서 얻은 값을 보고 위에서 설명드린 -s 옵션과 함께 사용하면 됩니다.


명령어 10. "dlog" [<filter_spec>]

개발시스템에 접속한 리모트장치의 상태를 dlog를 통해 엿볼 수 있습니다.

# sdb dlog

위의 명령어로 쉽게 로그를 출력할 수 있지요 :)


이상과 같이 간단하게 sdb의 명령어를 살펴봤습니다.

그럼 오늘도 즐거운 개발하시길... :)


끝_


안녕하세요, 타이젠 개발자 윤진입니다.


타이젠 데브랩을 진행할 때 빠지지 않고 언급했던 부분은,

애플리케이션의 기본 골격이라 여겨지는 라이프사이클입니다.

라이프사이클이 앱을 구성하는 필수적인 요소라는 것에는 재론의 여지가 없습니다.

중급개발자로 나아가기 위해서는 라이프사이클을 제대로 활용해야합니다.


하지만, 타이젠 스타터를 위한 데브랩에서 라이프사이클에 대한 설명이 필요할지 회의가 드네요.

애플리케이션을 작성할 때에는 분명히 유효한 개념일지는 모르지만,

처음 개발을 하는 사람들에게는 진입장벽만 높이고 있겠지요.

그래서 향후 데브랩에서는 따분한 라이프사이클, 이벤트핸들링, edc 따위는 날려버리려 합니다.

대신 네이티브 앱 작성이 얼마나 쉬운지 위주로 알려드릴 생각입니다. :)

(EFL 창시자 하이츨러 마스터와 함께 나눈 생각임을 알려드립니다.)


그 대신 블로그에서 마음껏 하고 싶은 얘기를 떠들 생각입니다.

네이티브 애플리케이션을 개발할 때 필수적인 개념들을,

하나씩 최대한 자세하게 짚으면서 풀어낼 예정입니다.

타이젠이 오픈소스인 이상,

소스단까지 파고들어가 동작원리와 코드리뷰를 하는 것도 좋겠네요.

그리고 소박하게나마 아키텍쳐 설계원칙도 제가 아는 선에서 언급하도록 하겠습니다.


어쨌든,

이번에는 이벤트 핸들링에 대해서 언급해볼까 합니다.


https://developer.tizen.org/community/tip-tech/application-fundamentals-developer-guide


이벤트 핸들링과 관련하여 개략적인 블록다이어그램입니다.

다이어그램에는 여러 낯선 용어들이 등장합니다.

AUL, AUL daemon, Application Information DB.


첫번째로 등장하는 AUL은 Application Utility Libray를 의미합니다.

한 앱에서 다른 앱을 런칭 혹은 리쥼 혹은 종료시킬 때 사용하는 API를 제공합니다.

AUL에서 제공하는 API는 "aul_" prefix를 가지고 있습니다.

타이젠 SDK에서 "aul_"로 시작하는 API를 발견하셨나요?


물론 발견하실 수 없을 겁니다. :(

왜냐하면 AUL API들은 플랫폼 내부에서 사용하는 함수군이기 때문입니다.


대신 외부에 오픈되어 있는 API로 app_control API가 있습니다.

app_control API 내에서 AUL을 사용하여 다른 앱을 컨트롤하게 됩니다.

app_control은 사용하기 쉽게 재가공한 API로 외부개발자들에게 노출되어 있습니다.

반면 AUL은 플랫폼 내부 피쳐로 외부에 노출할 필요가 없는 API도 관리하고 있습니다.

app_control repo. : platform/core/api/application


int app_request_to_launchpad_with_fd(int cmd, const char *appid, bundle *kb, int *fd, int uid)
{
	int must_free = 0;
	int ret = 0;

	SECURE_LOGD("launch request : %s", appid);
	if (kb == NULL) {
		kb = bundle_create();
		must_free = 1;
	} else
		__clear_internal_key(kb);

	ret = __app_send_cmd_with_fd(AUL_UTIL_PID, uid, cmd, kb, fd);

	_D("launch request result : %d", ret);
	if (ret == AUL_R_LOCAL) {
		_E("app_request_to_launchpad : Same Process Send Local");
		bundle *b;

		switch (cmd) {
			case APP_START:
			case APP_START_RES:
				b = bundle_dup(kb);
				ret = __app_launch_local(b);
				break;
			case APP_OPEN:
			case APP_RESUME:
			case APP_RESUME_BY_PID:
				ret = __app_resume_local();
				break;
			default:
				_E("no support packet");
		}

	}

	/*   cleanup */
	if (must_free)
		bundle_free(kb);

	return ret;
}


앱을 런칭하면 app_control에서 AUL로 런칭요청이 넘어오고,

결국 위의 API가 실행되게 됩니다.


위의 API 이름을 보면 여러가지 정보를 얻을 수 있지요.

app(앱)이 request(요청)를 하고 있는데,

launchpad(런치패드)라는 데몬에게 fd(파일 디스크립터)를 실어서 보내고 있군요.

여기서 launchpad가 바로 위의 블록다이어그램에 언급된 AUL daemon입니다.

Caller 앱은 미리 열어둔 유닉스 소켓을 사용하여 launchpad에게 요청을 전달합니다.

(socket과 관련된 내용은 aul-1/src/app_sock.c에서 살펴보실 수 있습니다.)


요청을 전달받은 launchpad는 caller 앱의 요청을 수행하기 전에,

caller앱에게 합당한 권한이 있는지 살펴봅니다.

합당한 권한이 있다면, caller 앱의 요청사항에 따라 callee 앱을 런칭/리쥼/종료하게 되고,

합당한 권한이 없다면, 아무 것도 수행하지 않습니다.


caller 앱의 요청이 callee 앱을 런칭시키는 것이라면,

런치패드의 한 모듈인 런치패드 로더에서,

사전에 fork/exec으로 만들어 놓은 프로세스를 활용하여 callee 앱을 띄웁니다.

fork/exec 자체가 상당한 시간을 소요하기 때문에,

앱 런칭 성능 향상을 위해 사전에 프로세스를 만들어놓지요.


static void __init_window(void)
{
	Evas_Object *win = elm_win_add(NULL, "package_name", ELM_WIN_BASIC);
	if (win) {
		aul_set_preinit_window(win);

		Evas_Object *bg = elm_bg_add(win);
		if (bg) {
			evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
			elm_win_resize_object_add(win, bg);
			aul_set_preinit_background(bg);
		} else {
			_E("[candidate] elm_bg_add() failed");
		}

		Evas_Object *conform = elm_conformant_add(win);
		if (conform) {
			evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
			elm_win_resize_object_add(win, conform);
			aul_set_preinit_conformant(conform);
		} else {
			_E("elm_conformant_add() failed");
		}
	} else {
		_E("[candidate] elm_win_add() failed");
	}
}

fork/exec 뿐만 아니라 위의 코드에서 볼 수 있듯,

- 윈도우 elm_win_add()

- 백그라운드 elm_bg_add()

- 컨포먼트 elm_conformant_add()

앱을 구성하는 필수적인 요소들을 사전에 만들어놓습니다.


static void __adapter_add_fd(void *user_data, int fd,
                             loader_receiver_cb receiver)
{
	__fd_handler = ecore_main_fd_handler_add(fd,
			(Ecore_Fd_Handler_Flags)(ECORE_FD_READ | ECORE_FD_ERROR),
			__process_fd_handler, NULL, NULL, NULL);
	if (__fd_handler == NULL) {
		_D("fd_handler is NULL");
		close(fd);
		exit(-1);
	}

	__receiver = receiver;
}

그리고 위에서 볼 수 있듯,

mainloop에 진입하기 전에 file descriptor도 등록하게 됩니다.

file descriptor를 통해 mainloop에 진입한 후에도,

fd로 넘어오는 이벤트를 처리할 수 있게 됩니다.

ecore_main_fd_handler_add()의 역할이 mainloop에서도 fd 이벤트를 처리해주는 것이지요.


자, 이제 앱을 런칭시킬 모든 준비가 끝났습니다.

윈도우 등을 비롯한 UI 컴포넌트도 만들어두고,

이벤트 전달을 위한 fd handler도 생성해두었습니다.

그렇다면 이제는 실제 callee 앱을 얹힐 차례입니다.


static int __loader_terminate_cb(int argc, char **argv, void *user_data)
{
	void *handle = NULL;
	int res;
	int (*dl_main)(int, char **);

	SECURE_LOGD("[candidate] Launch real application (%s)", argv[0]);
	handle = dlopen(argv[0], RTLD_LAZY | RTLD_GLOBAL);
	if (handle == NULL) {
		_E("dlopen failed(%s). Please complile with -fPIE and link with -pie flag",
			dlerror());
		goto do_exec;
	}

	dlerror();

	dl_main = dlsym(handle, "main");
	if (dl_main != NULL)
		res = dl_main(argc, argv);
	else {
		_E("dlsym not founded(%s). Please export 'main' function", dlerror());
		dlclose(handle);
		goto do_exec;
	}

	dlclose(handle);
	return res;

do_exec:
	if (access(argv[0], F_OK | R_OK)) {
		char err_str[MAX_LOCAL_BUFSZ] = { 0, };

		SECURE_LOGE("access() failed for file: \"%s\", error: %d (%s)",
			argv[0], errno, strerror_r(errno, err_str, sizeof(err_str)));
	} else {
		SECURE_LOGD("[candidate] Exec application (%s)", g_argv[0]);
		if (execv(argv[0], argv) < 0) {
			char err_str[MAX_LOCAL_BUFSZ] = { 0, };

			SECURE_LOGE("execv() failed for file: \"%s\", error: %d (%s)",
				argv[0], errno, strerror_r(errno, err_str, sizeof(err_str)));
		}
	}

	return -1;

}

위의 코드 상단부에 보면 dlsym으로 main 함수를 여는 부분이 있습니다.

바로 저기에서 런치패드 로더는 비로소 앱의 컨택스트를 프로세스에 탑재하게 됩니다.


앱의 컨텍스트는 application API를 사용하여 등록한 앱 라이프사이클을 의미합니다.

앱 개발자가 앱 라이프사이클을 등록할 때에는 application API를 사용하는데요,

application API는 내부적으로 app-core를 사용하지요.


EXPORT_API int appcore_efl_main(const char *name, int *argc, char ***argv,
				struct appcore_ops *ops)
{
	int r;

	r = appcore_efl_init(name, argc, argv, ops);
	_retv_if(r == -1, -1);

	elm_run();

	appcore_efl_fini();

	return 0;
}

위처럼 callee앱이 Application API를 사용하여 채워넣은 라이프사이클 정보-

create, terminate, resume, pause, control-는 appcore_ops라는 구조체로 app-core 쪽에 전달하게 됩니다.


static void __add_climsg_cb(struct ui_priv *ui)
{
	_ret_if(ui == NULL);
#if defined(WAYLAND)
	ui->hshow =
		ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_SHOW, __show_cb, ui);
	ui->hhide =
		ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_HIDE, __hide_cb, ui);
	ui->hvchange =
		ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_VISIBILITY_CHANGE,
				__visibility_cb, ui);
	ui->hlower =
		ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_LOWER,
				__lower_cb, ui);
#elif defined(X11)
	ui->hshow =
		ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHOW, __show_cb, ui);
	ui->hhide =
		ecore_event_handler_add(ECORE_X_EVENT_WINDOW_HIDE, __hide_cb, ui);
	ui->hvchange =
		ecore_event_handler_add(ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE,
				__visibility_cb, ui);

	/* Add client message callback for WM_ROTATE */
	if (!__check_wm_rotation_support()) {
		ui->hcmsg = ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE,
				__cmsg_cb, ui);
		ui->wm_rot_supported = 1;
		appcore_set_wm_rotation(&wm_rotate);
	}
#endif
}

그리고 각각의 라이프사이클 콜백 함수들을,

각각의 동작원리에 따라 App-core에서 관리하게 됩니다.

위의 코드에는 라이프사이클 중 resume/pause 이벤트가 나와있네요.

윈도우에 show/hide 콜백을 걸어놓고 resume/pause을 매칭시키죠.


이런 식으로 라이프사이클까지 등록까지 완료되면,

앱런칭을 위해 create 콜백, control 콜백, resume 콜백이 차례대로 불러줍니다.

그러면 최종적으로 UI를 갖춘 앱이 런칭이 되겠지요. :)


자, 여기까지-

- Application

- AUL

- App-core

- Launchpad

위의 네가지가 합작하여 앱을 런칭시키는 과정을 살펴보았습니다.


간단하게 보자면,

1. Application API의 app_control을 사용하여 callee 앱을 런칭하고자 시도

2. app_control API는 내부적으로 AUL을 이용하여 앱런칭 요청을 launchpad로 전달

3. launchpad는 사전에 process를 만들어 필요한 이벤트를 달아놓기

4. launchpad에서 미리 만든 process에 callee 앱의 main 함수를 dlsym으로 로드하기

5. callee main에서 Application API(내부적으로 App-core)를 사용하여 앱 라이프사이클 등록하기


위와 같이 요약할 수 있겠네요.

오래된 기억을 더듬어가며 썼기 때문에 최신의 구조에서는 변경된 항목이 있을 수도 있습니다.

자세한 내용보다는 전체적인 그림을 그리는데 이용하시면 좋겠습니다.


그럼 좋은 하루 보내세요~

끝_




안녕하세요, 타이젠 개발자 윤진입니다.


타이젠 스토어에 앱을 올리려다가 좌절하신 적이 있으신가요?

타이젠 스토어가 다른 스토어보다 상대적으로 엄격하게 앱을 심사한다는 얘기가 들리는데요.

앱을 사고파는 '스토어'이니 소비자가 피해보지 않도록 최선의 노력을 하고 있다고 생각해주세요.


사실, 테스트하는 쪽도 굉장히 번거로울겁니다. :)

앱을 직접 설치하여 수많은 항목을 하나씩 테스트를 하고 있으니까요.

문제가 있으면 문제 상황에 대한 동영상도 촬영하고 그에 대한 설명도 자세하게 달아주지요.

스토어도 개발자 여러분과 함께 앱을 잘 만들기 위해 노력하고 있습니다.


타이젠 스토어를 여기저기 뒤져보면 개발자 셀프 체크리스트를 확인하실 수 있습니다.

타이젠 스토어에 앱을 올리기 전에 셀프 체크리스트를 보며 하나씩 테스트해보는게 어떨까요?

셀프 체크리스트만 체크해도 '거절'을 상당수 막을 수 있습니다.


http://seller.tizenstore.com/info/guideDownload.as


위의 주소에 가면 여러가지 가이드 문서를 확인하실 수 있습니다.

판매자 가이드, 가격, 쿠폰 등 금전적인 부분은 제대로 확인해야겠죠?

이 포스팅에서는 앱 자체에 대한 셀프 체크리스트를 훑어보겠습니다.

<Tizen Validation Self Check List>를 다운로드하여 엑셀파일을 열면,

총 7가지 카테고리에 대한 셀프체크 리스트가 나옵니다.


첫번째는 기본정보 카테고리입니다.

- 타이젠 스토어에 직접 기입하는 아이콘, 스크린샷, 설명, 태그는 제대로 채워넣어야겠지요(I-1)?

- 2개국 이상에 판매하려면 영어로 앱이름, 설명을 채우라는 얘기도 있습니다(I-2).

- 만약 타이젠 스토어에 기입하는 Description으로 앱의 동작을 충분히 설명할 수 없다면,

  앱의 메뉴에 헬프옵션도 넣을 필요가 있습니다(I-5).


두번째는 설치와 실행에 대한 카테고리입니다.

- 앱 패키지 사이즈는 4메가를 넘으면 안됩니다(II-1).

- 그리고 실행 및 종료에 문제가 없어야 합니다.

  간혹 실행은 문제없는데, 종료를 하면 '죽어버리는' 앱이 있습니다.

  종료상황이라 하더라도 앱이 죽어버리면 안됩니다(II-5).

  태스크매니져를 통해 종료'당하는' 경우,

  네이티브앱같은 경우 app_terminate_cb() 콜백이 불리는데요,

  거기서 앱 종료를 위한 작업을 제대로 수행하는지 살펴보시면 되겠네요.


세번째는 기능에 대한 카테고리입니다.

'기능'에 대한 부분이 심사에서 거절되는 경우가 많으니 꼼꼼하게 챙겨주세요.

- 화면을 구성하고 있는 모든 버튼(기능)은 제대로 동작해야합니다.

  동작하지 않는 버튼이 있다면 아예 빼버리셔야해요(III-1).

- 화면 해상도도 신경쓰셔야합니다.

  Z1(480x800)에 이어 Z3(720x1280)가 나왔기 때문에,

  해상도가 다른 두 디바이스에서 제대로 동작할 수 있도록 앱을 만들어야 합니다.

  네이티브는 기본적으로 Scalability를 지원하고 있습니다(III-2).

- 가로/세로 모드를 모두 지원하는 앱이라면,

  두 모드에서 모두 view/component가 어긋나지 않는지 살펴보셔야 합니다.

  가로모드나 세로모드를 추가개발하기 어렵다면 한 모드만 개발하는 것도 방법입니다(III-3).

- 앱은 백그라운드에서 수면모드가 되어야 합니다.

  앱 라이프사이클 중 pause_cb()와 resume_cb()을 사용하여,

  수면모드로 진입시 불리는 pause_cb()을 처리하여,

  불필요하게 자원을 소모하지 않도록 합니다(III-4).

- 앱이 특정 동작에서 5초 이상 멈춰있다면,

  반드시 유저에게 메시지나 진행바로 알려줘야합니다(III-5).

- 앱이 네트워크를 사용한다면 별도의 요금이 과금될 수 있다고도 안내해야합니다(III-7).


네번째 카테고리는 인터럽트에 대한 부분입니다.

- 콜, 메시지, 알람 이벤트 처리에 대한 부분인데요.

  이 부분은 콜이나 사운드나 영상을 사용하는 경우에 필히 확인해봐야합니다

  (IV-1, IV-2, IV-3).


다번째는 컨텐트에 대한 리뷰입니다.

앱에서 다루고 있는 내용 자체에 대한 심의를 하고 있습니다.

- 타이젠 브랜드를 사용하면 안됩니다(V-2). 마치 타이젠 공식앱인 것처럼 보일 수 있거든요.

- 포르노, 성적인 표현, 나체 금지(V-3)

- 정치, 이념, 인종, 종교, 성별 편견 금지(V-8)


여섯번째는 사용성에 대한 카테고리입니다.

- 앱은 가치있거나 재미있거나 독특하거나 유익해야한다네요(VI-1).

  단순히 다른 사이트를 링크하는 형식으로 앱을 개발하면 안되겠죠.

- UI/GUI가 잘 짜여져야한다는 내용도 있습니다(VI-2, VI-3).

  어찌보면 굉장히 주관적인 것처럼 보이기는 합니다만,

  누구나 납득할 만한 수준으로 검증합니다.


마지막은 '추천' 항목입니다.

- 런칭이 너무 느려선 안되겠죠(VII-2)

  이 부분은 app_create_cb()과 app_control_cb()을 적절히 사용하여,

  런칭 부분에서 최적화를 진행해야 합니다.

- 배터리가 없을 때에도 제대로 동작해야 합니다(VII-7)

  배터리에 대한 이벤트 콜백이 있으니,

  배터리가 많이 필요한 루틴이 있다면,

  배터리가 일정 용량 이상일 경우에만 실행할 수 있도록 하는게 좋겠죠.


셀프체크리스트를 모두 통과했지만,

스토어에서 전문 테스터가 테스트를 진행하다보면 다양한 이상현상이 나타납니다.

적게는 1~2차례 그리고 많게는 5~6차례 거절도 당합니다.

좌절하지 마시고 끝까지 도전해보세요. :)


끝_


* References

http://seller.tizenstore.com/info/guideDownload.as

  1. YOhoho 2015.11.20 01:30

    자주 들르고 있는데 와 블로그의 포스팅 하나하나가 전부 주옥같은 글이네요
    좋은 정보 많이 얻어갑니다
    열심히 공부해서 타이젠스토어에 앱도 올려보고 싶네요!

    • 코코콩 2015.11.20 09:00 신고

      왠지 나만알던 맛집이 TV에 나온기분이네요 ㅋㅋㅋ

    • 안녕하세요, YOhoho님.
      타이젠 스토어에 YOhoho님의 앱이 올라올 날을 기다려야겠네요.
      앱을 업로드하면 알려주세요.
      블로그에서 홍보해드릴께요. :)

      코코콩님,
      늘 감사드립니다. 맛집인 줄은 몰랐네요. 히히;

  2. 2015.11.20 10:09

    비밀댓글입니다


안녕하세요, 타이젠 개발자 윤진입니다.


타이젠 플랫폼이 탑재된 기어S2를 구매하여 일주일째 사용하고 있습니다.

가급적이면 소비자의 시각에서 기어S2를 냉철하게 판단하고 싶지만 쉽지 않네요.

앱이 훅 죽어버린다거나 배터리가 광탈하면 심장이 덜컥 내려앉습니다.

결국 참다못해 기어S2를 호스트PC에 연결하여 여러가지 문제상황을 파악해보고자 합니다.


호스트PC와 기어S2를 연결하기 위해서는,

Tizen SDK 2.3.1 버전을 다운로드 받으셔야 합니다.

최종적으로 필요한 툴이 sdb(Smart Development Bridge)인데요,

sdb의 버전이 2.2.67 이후여야 기어S2가 제대로 인식됩니다.


Tizen SDK 2.3 버전인 경우,

sdb의 버전이 2.2.51이기 때문에 기어S2를 인식하지 못합니다.

2.3 환경에서 기어S2와 호스트PC를 연결해도 offline으로 인식하니 괜한 삽질하지 마세요~


Tizen SDK 2.3.1은 여기에서 받으실 수 있습니다.

현재 Tizen SDK 2.4가 최신 플랫폼입니다만,

Gear S2에는 Tizen 2.3.1 플랫폼이 탑재되었기에,

Gear S2용 앱을 개발하시려면 반드시 Tizen SDK 2.3.1을 설치하셔야 합니다.


기어S2는 cradle이나 extension으로 호스트PC와 연결하지 않습니다.

대신 기어S2를 호스트PC와 동일한 네트워크로 묶는 방식으로 연결합니다.

가정용 라우터가 있으면 호스트PC와 기어S2를 함께 연결해주세요.

물론, 기어S2는 무선으로 연결해야하겠지요?


1. 기어S2 디버깅모드 활성화



우선 기어S2의 디버깅 모드를 활성화해야합니다.

기어S2 오른편 하단 버튼을 눌러 Apps를 런칭합니다.

Apps > Settings(설정) > Gear info(Gear 정보) > Debugging(디버깅)

위처럼 진입하여 디버깅 모드를 활성화합니다.

디버깅 모드를 활성화해주어야 sdb를 붙여서 기어S2와 호스트PC를 연결할 수 있습니다.



2. 기어S2 와이파이 연결하기



기어S2를 라우터기에 연결할 차례입니다.

집에 무선 라우터기가 없으면 호스트PC와 연결할 수 없으니,

무선 라우터기가 없으신 분은 이 단계에서 무선을 지원하는 라우터기를 구매해주세요;


무선라우터기에 연결하기 위해서는,

Apps > Settings(설정) > Connections(연결) > Bluetooth(블루투스) > Bluetooth(블루투스)

블루투스를 우선 "비활성화"해주세요.

기어S2는 블루투스를 통해 와이파이를 연결하기 때문에,

블루투스를 꺼야 라우터에 수동으로 접속할 수 있습니다.


그리고,

Apps > Settings(설정) > Connections(연결) > Wi-Fi > Wi-Fi

위처럼 진입하여 Wi-Fi를 활성화해주세요.



Wi-Fi가 활성화되었다면,

Apps > Settings(설정) > Connections(연결) > Wi-Fi > Wi-Fi networks(Wi-Fi 네트워크)

위의 항목에 진입하여 연결된 라우터기를 선택합니다.

세부항목을 내려보면 IP 주소가 나오는데요,

이 주소로 호스트PC에서 접속할 수 있습니다.

위의 이미지 오른편에 보면 192.168.0.74라는 IP 주소가 나오네요.

이제 호스트 PC에서 sdb를 사용하여 기어S2에 연결할 수 있습니다.



우선 sdb 툴의 위치는 Tizen 2.3.1이 설치된 디렉토리 밑에 tools 디렉토리에 있습니다.

위의 예제에서는 기존에 사용하고 있던 sdb server를 죽이고 다시 띄웠는데요,

만약 기어S2에 연결이 안된다면 server를 죽이고 다시 띄운 후 시도해보세요.


$ sdb kill-server
$ sdb start-server


그리고 나서 sdb connect <IP주소>를 넣어 접속해주세요.

그러면 기어S2에 팝업이 하나 뜨는데요,

외부에서 접속하려고 하는데 의도한 접속인지 여부를 묻습니다.

확인버튼을 누르면 unauthorized에서 connected 상태가 됩니다.


자, 이제 연결이 다 되었습니다.

마음껏 탐험을 시작할 시간입니다.

아... root 권한이 아니어서 아음껏 탐험은 안되겠네요.

제한된 탐험이라도 즐겨보세요;


좋은 하루 보내세요~

끝_


* 본문에서 사용한 이미지 출처

http://developer.samsung.com/technical-doc/view.do?v=T000000251


  1. 코코콩 2015.11.19 20:51 신고

    안녕하세요 덕분에 타이젠2.3.1을 설치했네요... 웨어러블 sdk 설치하느라 며칠을 찾아보았는데 ㅎㅎ 감사합니다.
    그리고 문득 든 생각인데 타이젠이 성장하기 위해선 플래그쉽모델도 나와야하지않을까요? 물론 우선 앱생태계가 활성화되어야겠지만 듀얼OS로 지원을 해도 좋겠네요!

    오늘도 포스팅 잘보았습니다. 좋은하루되세요

    • 안녕하세요~ 코코콩님.
      이제 웨어러블의 세계에도 빠져드시겠군요 :)
      세상에 좋은 아이디어를 가진 사람이 많던데,
      웨어러블이라 가능한 재미난 앱을 만들어주세요~ 히힛.
      타이젠 플래그십 모델 출시 같은 큰 그림은 저 같은 일개 개발자 레벨에서는 잘 모르겠습니다. ㅠ_ㅜ
      멋지게 만들어놓으면 좋은 디바이스를 출시할 수 있겠죠~
      그럼 좋은 하루 보내세요~

  2. 전광하 2015.12.02 19:01

    안녕하세요.
    혹시, ip를 이용한 접근 말고, bluetooth 의 연결 상태에서는 sdb devices등의 제어를 할 수 없을까요?
    모단말과 gear s2는 거의 항상 블루투스로 연결되어 있어서, 모단말에서 제어를 해보고 싶은데요..
    궁금해서 문의 드립니다. 항상 감사합니다.

    • 안녕하세요,전광하님.
      현재로서는 ip를 이용하는 방법밖에 없습니다.
      하지만, 안드로이드를 라우터 삼아 웨어러블을 통제하거나,
      안드로이드에 올라가는 앱으로 웨어러블을 컨트롤하는 것도 재미있겠네요.
      좋은 의견 감사드리고 그냥 묻히지 않게 건의해보겠습니다.
      감사합니다.

  3. 보수동 2016.01.25 18:01

    안녕하세요? 타이젠으로 gear s2 에서 nfc app을 개발 중인 사람입니다. 실례가 되지 않는다면 질문을 좀 드리고 싶은데요. 타이젠에서는 nfc.tag feature 를 지원하는데 gear s2에서 지원을 하지 않는 것 같네요. 혹시 gear s2 에서 nfc.tag feature 를 언제 쯤 사용 가능할지 알 수 있을까요?

    • 안녕하세요, 보수동님.
      진심 대답해드리고 싶지만, 상품(Gear S2)의 피쳐에 대해서는 플랫폼 개발자가 알 수가 없어서요.
      지원여부는 http://developer.samsung.com/ 에서 문의하시는게 어떨까요?
      속시원한 답변을 드리지 못해 송구스럽네요.

    • 보수동 2016.01.26 00:09

      빠른 답변 감사합니다!!

    • 아, 넵. 감사합니다. 즐거운 하루 보내세요~!

  4. kykim 2016.01.30 21:23

    error: failed to connect remote target 'IP주소'만 계속 뜨네요...

    기어S2 블루투스, 3G 해제, 디버깅 ON, IP 주소 확인, 컴퓨터와 같은 네트워크 확인, sdb 버전 확인 다 했는데

    혹시 제가 빠트린 게 있을까요?

  5. 안녕하세요~ kykim님.
    같은 네트워크를 물리셨다는게 같은 라우터를 쓰셨다는것이지요?
    기어S2의 설정>네트워크에 들어가서 와이파이를 확인하면 네트워크 주소의 앞 세자리가 같은 라우터에 연결된 컴퓨터의 네트워크 앞 세자리와 동일한거죠?
    그렇다면 기본적으로 안될 이유는 없어보이는데요,

    그래도 아이피를 찾을 수 없다고 하니,
    기어의 와이파이를 다시 설정해보고,
    기어를 재부팅해보고,
    호스트피씨에서 sdb kill-server도 해봐야할 것 같습니다.

    꼭 연결에 성공하시면 좋겠네요.
    윤진 드림.

  6. 안녕하세요 2016.09.07 19:53

    지금 이 방식대로라면 혹여나 사진전송,파일전송같은 행위를 할수 있을까요?

  7. 노마십가 2019.05.03 03:57 신고

    혹시 게시글 대로 했음에도 error: failed to connect to remot tartget 에러가 발생하신다면,
    디버그 모드 킨 이후에는 꼭 디바이스 재부팅 해주세요 ㅠㅜ
    기기 재부팅 하고 나니까 잘붙습니다 흑흑


안녕하세요, 타이젠 개발자 윤진입니다.


지난 주에 기어S2를 구매하여 매일 시계를 사용하고 있습니다.

모바일과 블루투스로 연결해놓은 상태에서,

- 모바일에서 웨어러블로 수백건의 노티정보를 전달하고,

- 웨어러블에서 모바일의 전화앱이나 뮤직플레이앱 등을 수시로 조종하고,

- 티머니앱으로 NFC를 끊임없이 깨우고,

- 와치페이스를 틈틈이 들여다보며 디스플레이를 켰습니다.

아침 일곱시경부터 밤 열한시경까지 16시간에 배터리를 평균 45% 정도 소모하였습니다.

이틀 사용하기에는 약간 빠듯해보이지만 하루 사용하기에는 전혀 문제없습니다.


기어S2 용으로 출시된 흥미로운 앱을 뜯어보며 와치의 기능성을 탐구하고 있는데요,

때마침 스타벅스에서 기어S2용으로 앱을 출시하였습니다.



삼성 기어 스토어 최상단에 홍보가 되고 있습니다.

"스타벅스 매장에서 기어S2로 간편하게 결제하세요"



홍보배너를 누르니 총 세 개의 앱이 나옵니다.

S2에서 스타벅스 결제카드로 사용할 수 있는 스타벅스앱 하나와 와치페이스가 두 개 있네요.

스타벅스앱은 Companion 방식으로 동작하기 때문에,

모바일에도 스타벅스앱을 설치해주어야 합니다.

결제카드 정보는 모바일에서 입력하고 웨어러블에서는 모바일의 데이터를 사용하게 됩니다.

여기서는 아래 4개의 앱을 모두 다운로드 받겠습니다.


1. 모바일 스타벅스앱

2. 웨어러블 스타벅스앱

3. 와치페이스 블랙

4. 와치페이스 화이트


모바일 스타벅스앱에서 결제카드 정보를 입력하고,

웨어러블앱을 실행합니다.



앱을 실행하면 스플래시이미지로 스타벅스 로고가 나옵니다.

로딩하는데 약간의 시간이 소요되는 것으로 보아서,

이 타이밍에 모바일과 웨어러블이 데이터를 교환하는 것으로 여겨집니다.

결제카드 정보를 주고 받겠죠.



첫 화면으로 회원의 등급이 나옵니다.

그린레벨 4점이네요.

골드레벨로 올라가려면 21점을 더 모아야 한다고 하네요.



회원등급화면에서 카드화면으로 넘어가려면,

베젤을 시계 방향으로 돌려서 이동해야 합니다.

화면을 드래그해도 페이지는 이동하지 않습니다.

개인적으로는 베젤이벤트와 화면이벤트를 모두 이용하는걸 선호해서요,

자꾸 손으로 화면을 드래그를 하는데 동작하지 않아서 답답합니다.

웨어러블 앱을 작성하시는 분은 참고해주세요.



와치페이스는 검은색과 흰색이 구비되어 있습니다.

검은색 와치페이스의 평가는 4.5점이고 흰색 와치페이스의 평가는 2.5점이네요.


스타벅스 와치페이스를 기본시계로 설정해둔 상태에서,

와치페이스를 터치하면 스타벅스앱이 바로 실행됩니다.

스타벅스를 애용하시는 분들에게는 편리한 기능이겠네요.


검은색 스타벅스 와치페이스를 설정한 뒤 하루종일 사용했는데요,

배터리 소모량이 45%에서 90%로 2배가 됐습니다.

밤 11시가 되니 10%의 배터리만 남아있네요.


평소 사용하는 그대로의 환경에서 와치페이스만 바꿨으니,

당연히 범인은 와치페이스일 것으로 추정했습니다만...


다시 24시간 테스트를 진행하니 스타벅스 와치페이스 때문이 아니었습니다.

스타벅스 와치페이스의 CPU / 메모리 점유율도 준수하고,

하루종일 사용해도 배터리를 40% 정도만 소모하네요.


90%를 소모한 원인은 다른 곳에 있나봅니다.

일단 재현을 해봐야 원인을 찾을 수 있겠지요.

배터리가 광탈인 분들은 어떤 환경에서 그리 되는지 알려주세요.


그럼 좋은 하루 보내세요~

끝_



  1. 천재태지서주영 2015.12.02 23:57

    재밌게 잘 봤어요. 카드가 표시된 상태에서 결제도 되나요?
    그리고 "결재" -> "결제" 입니다.

    • 아니 이게 누구신가~ 히힛.
      카드가 표시된 상태에서 한 번 탭하면 바코드가 나옴.
      특별한 기술을 사용하는 것은 아니고 그냥 바코드인식.

      그리고 나... 요즘 맞춤법이 기억이 안남 ㅠ
      기억 안나는건 맞춤법 뿐만이 아님;
      우선 본문은 전부 수정했어. 고마워!


안녕하세요, 타이젠 개발자 윤진입니다.


타이젠 플랫폼이 탑재된 또 하나의 웨어러블 기기,

기어 S2가 지난 10월 초에 출시되었습니다.


기어2 / 기어S1에 이어 기어S2가 나왔으니

제 기억으로는 타이젠이 탑재된 세번째 웨어러블 디바이스입니다.


사실 출시 직후에 설렁설렁 대리점에 가서 구입하려고 했는데요,

예상외로 반응이 뜨거워 구매할 수가 없었습니다.


타이젠을 개발하는 사람이 완제품을 구매할 필요가 있냐는 질문도 있는데요,

개발시료는 사내에서 개발을 위한 목적으로만 사용하는 것이라서 여러가지 제한이 있습니다.

그래서 개발자도 완제품이 궁금하지요.

완제품을 실생활에서 써봐야 1) 부족한 점도 발견할 수 있고 2) 개선해야할 점도 보이겠지요.


그래서 모바일샵에서 예약주문을 걸어놓았습니다.

2주 전쯤에 예약 주문을 해놓았었는데 그제 저녁에 물량이 입고 되었다고 연락이 왔습니다.

그래서 드디어 어제 수령하였습니다.



기어S2 클래식 버전을 구매하였습니다.

기어S2가 원형 디바이스이니 상자도 원통으로 디자인한 것으로 보입니다.

전면엔 Samsung Gear S2 classic이라고 쓰여있습니다.



상자 옆면에는 봉인스티커가 붙어있습니다.

"Do not accept if seal is broken"

그리고 누가 만들었는지 실명으로 적혀있네요.

"Made by Nguyen Xuan Huynh"

이름을 봐서는 베트남분께서 제조하신게 아닌지 조심스럽게 예측해봅니다.

감사합니다, 잘 사용하겠습니다.



원통 상자의 뚜껑을 열어보니 기어S2가 모습을 드러냅니다.

기어S2의 톱니 베젤과 검은색 가죽끈이 눈에 띄네요.



시계가 담긴 뚜껑을 열어보니 그 안에 여러가지 부속품이 놓여있었습니다.



전원케이블, 충전거치대, 가죽끈입니다.

충전거치대는 자석으로 되어 있어서 시계를 놓으면 달라붙게 되어있습니다.

별도의 가죽끈은 이미 시계에 부착된 끈보다 짧습니다.

손목이 가느다란 여성을 위해 제공되는 끈이겠지요.



기어S2 클래식을 다양한 각도에서 찍어보았습니다.

시계 본체가 두껍다는 의견을 어디선가 본적이 있는데요,

평소에 차고 다니던 아날로그시계보다는 (당연히) 얇고, 

전작 기어시리즈에 비해서는 1~2mm 정도 두껍지만 느껴지진 않습니다.



무선 충전 거치대에 시계를 올려놔보았습니다.

시계 뒷면과 충전 거치대가 자성으로 붙습니다.

시계 가죽끈을 풀어헤쳐놓아도 시계를 거치대에 안착시켜 균형을 이루는데에는 아무 문제가 없습니다.


차후에 가죽시계줄 보다 상대적으로 무거운 메탈시계줄로 교체를 해볼 생각인데요,

메탈의 무게에 따라 거치대가 넘어갈 수도 있겠네요.

시계를 90도 눕히지 않고 정면 그대로 거치할 수 있는 방식도 괜찮겠네요.

누가 만들어 주시면 구매할 의향이 있습니다. :)



기어S2 오른편에 버튼이 두 개가 있습니다.

아날로그 와치에도 2~3개의 용두가 튀어나와 있는데요.

기어S2에는 두 개의 버튼만을 사용하고 있습니다.


우선 상단의 버튼은 백키입니다.

타이젠 혹은 갤럭시 모바일 디바이스를 사용해보셨다면,

하단에 백키와 홈키를 줄기차게 사용하셨을텐데요.

웨어러블에서는 백키와 홈키를 두 개 유지하는 대신 백키 하나로 통합하였습니다.

모바일에서는 뷰의 depth가 깊기 때문에 한 번에 홈으로 가기 위해 별도의 키가 필요했는데요,

웨어러블에서는 뷰의 depth가 얕기 때문에 백키를 한 두번 누르면 홈으로 진입하지요.

그렇기 때문에 두개의 버튼을 각각 유지하는 대신 키 두개를 하나로 합쳤습니다.


하단의 버튼은 Apps를 띄우는 버튼입니다.

기어S2에 킬러앱이라 불릴 만한 것들이 하나씩 출시되고 있는데요,

사용자가 기어S2에 설치하는 앱은 Apps에 모두 표시가 되겠지요.

앱을 사용하는 빈도가 높아질테니 당연히 별도의 버튼을 두어 Apps에 진입하게 하였습니다.



부팅이 거의 완료되었습니다.

시계를 최초 구동하게 되면 위처럼 웰콤 페이지가 나타납니다.



안드로이드폰에서 삼성 기어앱을 다운로드 받으라는 안내가 나옵니다.

과거에 기어2를 구매한 직후 갤럭시에 삼성 기어앱을 다운로드받아 사용하였었는데요,

한동안 삼성 기어앱을 사용하지 않다가 이번에 기어S2를 구매하여 다시 실행하였습니다.



삼성 기어앱에는 과거에 사용한 제품군이 모두 노출되네요.

추가로 새로 등록할 Gear S2도 나타나는군요.

Gear S2를 선택하여 갤럭시 노트3와 기어S2를 연결을 시도해보겠습니다.



갤럭시에서 기어S2 항목을 선택하니,

기어S2에 "Gear와 갤럭시 디바이스를 연결합니다"라는 문구와 인증번호가 표시되었습니다.

예전에 회사건물 R5에 상주한다고 하여,

R5죽돌이라고 갤럭스 디바이스 이름을 정했었는데 그게 아직까지 남아있네요.



갤럭시화면에서도 위의 기어S2에 표시된 인증번호가 나타나고 있습니다.

기어S2의 인증번호와 갤럭시의 인증번호가 맞게 되어있는지 확인한 후 '확인'버튼을 누릅니다.



갤럭시와 기어S2가 동기화를 시작합니다.

그 과정에서 27.17메가 바이트를 다운로드받아 설치하였습니다.



이용약관 항목을 체크해야합니다.

사용자가 생성하는 데이터를 서비스제공업체에 전달하는 것에 대한 동의표명을 해야합니다.



"S Voice와 Voice 유관기능 사용에 동의하며 이를 위해 서버를 통한 음성인식 사용에 동의합니다"

"내 Gear 찾기 & 내 휴대전화 찾기 사용에 동의하며, 이를 위해 위치 정보 공유에 동의합니다"

위의 두 가지는 필수 동의사항입니다.

그리고 "진단정보 보내기에 동의합니다"는 옵션입니다.



이제 거의 다 진행하였습니다.

기어S2에는 마지막 과정으로 헬프메뉴가 떴습니다.

"연습해볼까요?"

"위젯을 확인하려면 베젤을 시계 방향으로 돌리세요"



시계방향으로 돌려 위젯을 확인한 후,

"반대 방향으로 돌리면 시계로 돌아갑니다."



시계가 보이는 화면에서,

"알림을 확인하려면 베젤을 시계 반대 방향으로 돌리세요."



알림이 보이는 화면에서,

"돌아가려면 뒤로가기 버튼을 누르세요"

친절하게 뒤로가기 버튼의 위치가 표시되어 있습니다.

이 시점에서 "좋아요"라는 칭찬도 받습니다.



그리고 시계화면에서,

"상태표시를 보려면 상단에서 아래로 내리세요"

상태표시에서는,

- 블루투스로 연결이 되어있는지를 확인하고,

- 뮤직플레이어에 진입하고,

- 진동 및 화면을 끈채로 유지하는 매너모드로 진입하고,

- 밝기를 조절할 수 있습니다.

시계가 보이는 화면에서만 상태표시로 진입할 수 있습니다.

위젯이나 알림이 보이는 화면에서 상단에서 아래로 내리면 시계화면으로 복귀합니다.



상태표시가 보이는 상태에서,

"상태표시를 숨기려면 하단에서 위로 올리세요"



그리고 어느 화면에서나,

"손바닥이 닿도록 화면을 덮어 화면을 끄세요"

시계를 손바닥으로 덮으면 LCD가 꺼집니다.



여기까지 진행하였다면 필요한 내용을 거의 완료하였습니다.

- 추가로 오른쪽 하단 버튼을 누르면 Apps에 진입할 수 있습니다.

- 혹은 기본으로 설정되어있는 위젯에서도 Apps에 진입할 수 있습니다.

- 그리고 실행된 앱을 보려면 Apps에서 '최근 사용 앱' 아이콘을 선택해야 합니다.



디폴트로 설정되어 있는 아날로그 와치페이스입니다.

- 상단에 충전된 용량이 나와있고,

- 오른편에는 날짜가 나와있고,

- 하단에는 만보기 기능이 탑재되어 있습니다.

초침의 움직임이 상당히 부드럽습니다.



아름다운 여성분께 착용을 부탁드려보았습니다.

여성분이 차기에도 무난한 크기입니다.



어제 수령하여 오늘 하루종일 차고 다녀봤습니다.

기본적으로 제공되고 있는 와치페이스 13종을 하나씩 사용해보는 재미가 있네요.

블룸버그 와치페이스 외에는 모두 디폴트로 설치되어 있는 와치페이스입니다.


파트 내부에서 유려한 디자인의 와치페이스도 개발하고 있는데요,

멋진 디자인의 와치페이스가 많이 개발될거라 생각합니다.

네이티브 와치페이스를 위한 개발방법론도 tizen.org에 공유하려고 하니 기대해주세요.



가장 만족도가 높았던 앱은 티머니 기어입니다.

후불제 신용카드를 티머니 기어앱에 등록해두고 버스 & 전철을 타 보았습니다.

기어S2를 카드리더기에 살짝 터치하니 바로 '삑' 소리가 나며 체크가 되더군요.

처음에는 티머니 기어앱이 화면에 보여야만 동작하는 줄 알았는데요,

백그라운드에 있더라도 제대로 동작하였습니다.

이제 대중교통을 이용할 때 더 이상 지갑을 꺼내지 않아도 됩니다.



그 외에도 여러가지 재미난 앱/와치들이 많이 있습니다.

김기사 앱도 다운로드 받아봤는데요,

조그마한 화면에 모바일에서 보던 기능을 그대로 구현해놓아 놀랐습니다.

사용자 UX를 좀 더 가다듬는다면 제법 그럴듯한 앱이 되겠네요.


조만간 다른 흥미로운 앱들도 출시된다는 첩보가 있는데요.

안테나를 세우고 기다려봐야겠습니다.


그 외에도,

- 카톡 알림에서 이모티콘을 이용한 답장이 가능합니다.

- 알림 진동이 부드럽지만 분명히 인지되어 전화/문자를 놓치는 일이 없어졌습니다.

- 하루종일 신나게 사용해도 배터리 50% 정도만 소모되더군요.


이상으로 하루 사용해본 리뷰를 마치겠습니다.

끝_

  1. 코코콩 2015.11.05 10:46 신고

    아아 리뷰 잘보았습니다.!

    사실 저도 오늘 기어s2클래식이 도착하는데 너무기대가되네요! ㅎㅎㅎ

    오늘도 좋은하루되세요

  2. 코코콩 2015.11.23 11:21 신고

    음 오늘 사용사면서 문득 느낀건데요! 뮤직플레이어 제어할 때 음악리스트들도 나와서 선택할수있으면 좋겠네요!


안녕하세요, 타이젠 개발자 윤진입니다.


올초에 Tizen 2.3 기반의 모바일 기기가 서남아에서 출시되었었는데요,

3분기가 흐른 10월, 두번째 모바일 기기가 인도 시장에 다시 출시되었습니다.

Tizen 플랫폼은 버전을 하나 더 올려서 2.4가 되었습니다.


지난 10월 21일에 출시된 직후,

네이버 삼성 타이젠 카페를 통해 공동구매로 Z3를 구매하였습니다.

그리고 정확히 8일 후에 저희 집에 도착하였습니다.



멀리서 오는 만큼 박스 전체에 테이프로 꼼꼼하게 감쌌습니다.

테이프 위에 덧붙여진 송신인란에는 델리라는 글자가 선명하게 보입니다.

내용물에는 Gift라고 적혀 있네요.

제가 저한테 주는 선물이라 그런가 보군요;



우체국 국제 특송(EMS)으로 이용하여 델리에서 서울로 택배를 보내주었네요.

배송료는 16,000원 정도.



박스에 칭칭 감긴 테이프를 뜯어내어 박스를 개봉하니,

아주 믿음직스럽게 에어캡이 잔뜩 채워져있었습니다.

보기에는 안좋을지 모르겠지만요. :)



에어캡을 꺼내니 에어캡으로 다시 한 번 감싸진 박스가 나오네요.

척 봐도 Z3 본체박스입니다.



박스에 돌돌 말려져 있는 에어캡을 걷어내고 박스 전면을 찍었습니다.

검은색 Z3를 주문했는데 금색 Z3가 보여서 당황했습니다.

주문한 색상과 상관없이 박스 모델은 금색인가 봅니다.



박스 뒷면을 찍어보았습니다.

"Samsung Z3 powered by TIZEN OS"

제일 위에 타이젠 플랫폼이 탑재되어 있다고 명시해놓았네요.

플랫폼 버전은 생략된 것으로 보아,

플랫폼 버전은 개발자에게나 관심있지 소비자에게는 노출할 필요가 없는 정보인가 보네요.


그 아래로 세가지 주요한 특징이 나열되어 있습니다.

- Ultra Data Saving Mode

- 8MP + 5MP Camera

- Ultra Power Saving Mode

 인도시장에서는 데이터/파워를 절약할 수 있는 기능이 중요한 것으로 보입니다.


1.3GHz 쿼드코어 / HD sAMOLED / 8GB 메모리

주요 스펙은 이미 공지된 것과 똑같습니다.



"Do not accept if seal is broken"

봉인스티커가 파손되어 있는지 확인해보았습니다.

당연히 이상없더군요.



봉인스티커를 제거하고 본케이스를 꺼내보았습니다.

Z1(480x800)보다 커진 사이즈의 Z3(720x1280)가 위용을 드러내고 있네요.



박스안 구성요소는 스마트폰 살 때 으레 따라오는 녀석들입니다.

USB 케이블, 이어폰, 전원익스텐션, 충전지.



검은색 Z3의 정면모습입니다.

갤럭시보다 사각에 가깝지만 모서리는 라운드처리가 되어 있습니다.

손으로 움켜쥐었을때 그립감은 좋았고,

배터리를 탑재해도 상당히 가볍다는 느낌이 들었습니다.



체 왼편으로 여느 갤럭시 스마트폰과 마찬가지로 볼륨 상/하 버튼이 있습니다.

상/하 버튼은 두 키가 충분히 구분이 가도록 2Cm 남짓으로 만들었습니다.



뒷면에는 플라스틱커버가 씌워져 있습니다.

상단에 플래시, 카메라, 스피커구멍이 놓여져 있네요.

그리고 그 바로 밑에 'SAMSUNG'이라고 쓰여 있습니다.



하단에는 USB 케이블을 연결할 수 있는 포트가 있습니다.

박스에 있는 케이블을 포트에 꼽아 충전을 시키면 됩니다.



상단에는 이어폰을 꼽을 수 있는 이어잭이 있습니다.

가장자리는 전면에 비해 후면이 작게 디자인되도록 경사를 두었네요.



뒷면 커버를 빼어 2600 mAh 배터리를 꼽았습니다.

배터리 윗 편으로 심을 꼽을 수 있는 슬롯이 2개 보입니다.

Z1과 마찬가지로 Z3에는 심카드를 2개 꼽을 수 있습니다.


기기 전면 오른편에 위치한 파워키를 롱프레스하여 전원을 켰습니다.

시작하자마다 모델명 Z3가 표시되고 그 아래로 타이젠이 표시됩니다.



그리고 삼성 애니메이션이 나옵니다.

삼성 애니메이션이 나오고 10여초가 지나면 부팅이 완료됩니다.



첫 부팅 직후에 나온 웰컴화면입니다.

하단에 언어선택 버튼이 나와있습니다.

초기설정은 영어인데 버튼을 눌러 다른 언어로 변경할 수 있습니다.



서남아 시장에 출시되어 그런지 낯선 언어들이 상당히 많이 보입니다.

언어선택화면에서 해독이 가능한 언어는 영어와 한국어 뿐입니다.

한국어를 선택해보도록 하겠습니다.



영어로 표시되었던 웰컴화면이 한글로 변경되었습니다.

언어선택버튼도 '한국어'로 바뀌었습니다.

화면 하단의 화살표 모양으로 슬라이드업하면 다음 설적을 할 수 있는 화면이 올라옵니다.



이용약관을 읽어보고 '동의합니다'에 체크를 하였습니다.

데이터 제공에 대한 동의도 '예'를 눌렀습니다.



그리고 바로 와이파이를 연결하니 한국시간이 바뀌었습니다.

삼성계정은 필수항목이라 기존에 가입한 아이디로 로그인을 하였습니다.

아이디가 없으신 분들은 계정을 생성하시면 됩니다.



계정 로그인이 완료되면,

삼성계정으로 백업된 데이터를 복원할 수 있습니다.

"삼성 계정을 사용하여 데이터를 백업하고 복원할 수 있습니다. 계정에 백업해 둔 데이터가 있는 경우, 해당 데이터를 이 디바이스에 복원할 수 있습니다"

기존에 삼성계정에 백업해둔 데이터가 없으므로 복원을 진행하진 않았습니다만,

차후에 삼성디바이스간 데이터를 교환하기 위한 수단으로 사용하면 되겠네요.



구글 계정으로 로그인도 하였습니다.

구글에서 제공하는 서비스도 사용할 수 있군요.

지메일/구글캘린더/유투브 등의 서비스를 이용할 수 있다는 설명이 나옵니다.



초기설정을 마치면 드디어 홈화면이 나옵니다.

홈화면의 기본적인 구조는 Z1과 동일합니다.

하단에 Favorite 아이콘이 두 줄로 나와있고,

하단 영역을 슬라이드업하면 설치된 앱들이 나열된 메뉴화면이 나옵니다.



메뉴화면의 상단에 Favorite 두 줄이 표기되어 있고,

그 아래로 설치된 앱들이 나타납니다.

설치된 앱들은 두 페이지에 걸쳐 있습니다.

인도 시장에 특화된 Galaxy와 같은 앱이 보입니다.



필수앱 폴더를 열어보니 페이스북/페이스북메신져/위쳇/왓스앱 등의 앱이 보입니다.

국내 유명메신져가 올라가 있진 않지만,

해외에서는 페이스북 메신져가 많이 사용되고 있기 때문에 유용해보입니다.




화면 상단에서 하단으로 패널을 내렸습니다.

소프트웨어 업데이트 항목이 나타나 있습니다.

업데이트항목을 눌러 바로 업데이트를 진행해보도록 하겠습니다.



플랫폼에 전면적인 업데이트라기 보다는 버그픽스로 보이네요.

업데이트를 위해 3.7MB의 소프트웨어를 다운로드 받으면 됩니다.

업데이트 정보에도 안정성을 개선하였다는 문구 정도만 노출되어 있습니다.



다운로드 용량이 얼마 안되어 바로 설치가 완료되었습니다.

소프트웨어 업데이트 후 재부팅하니 락화면이 나오네요.



우측 하단에 카메라 버튼을 드래그하여 카메라앱을 바로 띄울 수 있습니다.

카메라 버튼을 누르면 흰색 선이 원형으로 확대되고,

손으로 드래그를 해야 카메라앱이 실행됩니다.



심카드를 꼽고 부팅을 2번 하니 바로 사용이 가능해지네요.

화면 상단의 인디케이터바에 첫번째심이 꼽혀 있음을 알려주는 아이콘이 떴습니다.

그리고 KT에서 개통되었다는 안내문자를 여러개 보내주었습니다.



세팅앱에 들어가서 디바이스정보를 열어보았습니다.

모델번호는 SM-Z300H입니다.

타이젠버전은 2.4.0.1입니다.

Tizen 2.4의 새로운 기능을 사용하여 앱을 개발하셨다면 Z3에 올려 테스트하실 수 있습니다.



비디오 플레이어에서 영상을 보다가,

영상을 터치하여 시계방향으로 돌리면 영상을 다음으로 빨리넘길 수 있습니다.

반시계방향으로 돌리면 이전으로 돌아갑니다.

영상을 볼때 막대바를 선택해서 이전/다음으로 넘어가기가 힘들었었는데,

반시계방향/시계방향으로 정밀하게 넘기는 기능은 정말 편하더군요.



뮤직플레이어에 음악을 들으면서 바로 내 목소리를 '녹음'할 수 있는 기능도 있습니다.

위의 캡쳐이미지는 음악을 재생하고 있는 화면인데요,

중간에 '녹음'이라는 버튼이 보이시죠?

녹음 버튼을 누르면 다시 0초부터 재생이 시작되고 동시에 녹음도 됩니다.



위의 이미지를 보시면,

재생과 녹음 모두 00:02를 가리키고 있는 것을 확인하실 수 있습니다.

노래 연습이 필요할 때 사용하면 되겠네요.



아스팔트앱이 설치되어 있길래 실행해보았습니다.

앱 로딩이 상당히 가볍게 진행되어 좀 놀랐습니다.

앱단에서도 충분히 최적화가 진행된 것으로 보입니다.



데모플레이 버튼을 눌러 레이싱도 즐길 수 있습니다.

게임 중에 프레임이 드랍된다거나 움직임이 끊기는 현상은 전혀 발견하지 못했습니다.

다만, 제가 모바일 게임을 정말 못한다는 것을 다시 한 번 확인할 수 있는 시간이었습니다.



타이젠 스토어 앱을 열어보았습니다.

타이젠은 타플랫폼에 비해 아직 앱이 많이 부족합니다.

타이젠 플랫폼에서 구동할 수 있는 앱이 많이 늘어야 사용자들이 타이젠을 더 찾게되고,

사용자들이 많아져야 앱들도 더 늘어날텐데요.

아직은 그런 선순환을 타고 있진 않습니다.


타이젠 스토어에서 인스타그램과 유틸리티앱을 몇개 받았습니다.

원하는 앱이 다 있진 않지만 앱이 조금씩 늘고 있다는 사실에 안도가 됩니다.

현재는 앱 수익금 100%를 개발자에게 주고 있기 때문에,

이미 포화상태에 이른 다른 플랫폼에 비해 수익을 창출하는게 쉬울지도 모르겠습니다.

특히 개인개발자들에게 기회가 더 많지 않을까 싶습니다.



테마스토어도 개장했습니다.

테마스토어에서 디자이너들이 올린 테마를 다운로드 받아 바로 적용할 수 있습니다.



무료로 제공되고 있는 테마입니다.

SRIB에서 제작한 테마입니다.

배경/아이콘이 모두 변경되는 것을 스크린샷으로 확인할 수 있습니다.



사막 배경과 단촐한 아이콘이 맘에 들어서 Desert 테마를 다운로드 받았습니다.

SIDIA에서 제작한 테마이군요.

사이즈도 1.01MB 밖에 안되어서 다운로드는 금방 받았습니다.


설치 직후 바로 적용하였습니다.

스크린샷에 나와있는 대로 배경화면/배경색과 아이콘이 모두 변경되었습니다. :)



전체 색상톤도 바꿀 수 있습니다.

바꿀 수 있는 색상이 아주 많습니다.

위의 캡쳐이미지는 붉은 계열의 색상입니다.



전 마지막에 나와있는 그레이로 색상을 설정해놨습니다.

검은색 Z3 기기엔 역시 그레이죠...?

색상은 개인의 취향으로 고르시면 됩니다.

색상선택 기능은 Z1 때도 있었지만, Z3 색상이 좀 더 진화했습니다.


그 외에 흥미로운 기능들도 많이 있네요.

- 락스크린의 진화된 패턴인식

- 투명 키보드

- 계산서 분할기능

- 배터리/데이터 사용량 등을 한 눈에 볼 수 있는 스마트 매니져


당분간 타이젠 폰만 가지고 다녀봐야겠습니다.

몇 가지 앱을 사용할 수 없어서 불편하긴 하겠지만 익숙해지겠죠? :)


이상으로 간단한 Z3 리뷰를 마치겠습니다.

  1. 코코콩 2015.11.04 14:20 신고

    리뷰 잘보았습니다! 저는 실버를 기다리는 와중에... 유럽쪽에서도 출시예정(혹여 LTE버전이 나올까)이라는 기사를보고 대기중인데요...
    빨리 사고싶네요! 우선은 기어S2를 지르긴했지만... 배송이안되네요ㅋㅋㅋ
    아 그리고 타이젠 웨어러블 개발 관련하여 참고할 페이지나 도서 있으시면 추천좀 부탁드릴게요( _ _ )

    • 코코콩 2015.11.04 14:26 신고

      앗 찾아보니 서영진이 ebook으로 내신게 있네요 !!

    • 안녕하세요, 코코콩님~
      Z3가 유럽에서 출시될거라는건 이미 기사화가 되었는데요. 실제로 나올지, 나온다면 언제가 될지는 모르겠네요. 일개 개발자는 큰 전략을 알 수가 없어서요, 히히. (모르는게 자랑;)
      웹앱으로 개발하는건 서영진 작가님 책을 보시면 됩니다. 웨어러블 네이티브는 아직 참고할만한 책이 없지만... 조만간 나오지 않을까 생각합니다 :)

  2. 지나가던사람 ㅋ 2015.11.06 01:52

    최적화 좋다고 해서 검색해봤는데 엄청 디테일한 리뷰가 있었네요 ㅎ

    • 안녕하세요~! 다른 플랫폼에 올라가 있는 무거운 앱도 올려 비교해보고 싶어지네요. 앱스토어가 보다 활성화되길 바랍니다 :)

  3. shgud1234 2016.05.05 20:57

    네이버 타이젠 까페에서는 공동구매가 종료되었다고 하는데 다른 방법으로 구할 방법은 없을까요?

    • Z3는 서남아시장에만 출시되어서 국내에서 신제품을 구하긴 힘들 것 같습니다. 중고품이라도 알아보는게 어떨까요?
      원하시는 답변이 아닐 것 같네요... 죄송합니다... ㅠ_ㅜ


안녕하세요, 타이젠 개발자 윤진입니다.


소스콘 행사가 10. 27(화) ~ 28(수)에 열렸습니다.

화요일에 열린 키노트부터 시작하여 콘래드 호텔에 이틀동안 줄창 있었습니다.

흥미로운 이야기도 많이 듣고,

다양한 생각을 가지고 있는 사람들과 만난 즐거운 자리였습니다.

어마어마한 이력을 가지고 있는 사람들도 있고,

번뜩이는 재치가 넘치는 사람들도 많이 만났습니다.

둘다 가지고 있는 분들도 많더군요. 하핫.

역시 세상은 넓고 좋은 개발자는 많습니다.


국내에서 열리는 행사 뿐만 아니라 해외에서 열리는 행사에도 참가하고 싶어집니다.

그러기 위해서는 역시 부단히 영어공부를...

아... 할 게 너무 많습니다.


행사장 진입로


참가자 등록대


키노트 행사장 입구 & 발표자 등록대


아침 9시부터 등록이 시작되었습니다.

9시 30분쯤 행사장에 도착하니 이미 많은 사람들로 꽤나 붐비고 있었습니다.

참가자 등록대가 줄을 서서 잠시 기다렸다가 안내원에게 이름을 말했더니

발표자 등록대로 가라고 하더군요.


발표자 등록대를 지키고 계신 분은 "유우영"님이었습니다.

국내외 유명 개발자들과 두터운 인맥을 쌓고 계시더군요.

작년까지 공개SW 개발자대회의 운영에도 참여하셨는데요.

앞으로도 좋은 행사 많이 만들어주세요~


IoTivity 부스


Unity 부스


Wayland 부스


EFL 부스


키노트 행사장 앞에는 여러 개의 부스가 마련되어 있었습니다.

Social Web App Platform, JerryScript, GearVRf, IoTivity, Wayland, EFL 등의 부스가 있었는데요,

부스 근처에 있던 요기거리에 정신이 팔려서 부스를 제대로 구경하지 못한게 아쉽네요.

부스를 구경하는 사람들도 꽤 되어서 다른 사람 뒷통수만 신나게 찍고 왔습니다.


키노트 행사장


키노트행사는 10시에 시작되었습니다.

10시부터 12시까지 2시간이 좀 넘게 계속되었습니다.

흥미로운 내용이 보일 때마다 사진으로 열심히 찍었는데요,

집에 돌아와 사진을 살펴보니,

사진만으로는 무슨 내용이었는지 기억이 안나는 것도 있더군요.

아... 이 몹쓸 기억력...


키노트 진행자, Brian Warner


키노트 "오픈소스,소프트웨어 생태계의 핵심", 김영윤 상무님


"공유를 통한 새로운 가치 생태계 창조"


"안드로이드 플랫폼 확산 시장점유율 82.8%"


"기업의 오픈소스 프로젝트 참여도 증가"

"리눅스 총 참여 기업 1,200개사"


"소프트웨어 생태계 확산을 위한 오픈소스 전문 조직 운영"


"Web기반 플랫폼을 통해 다양한 IoT 기기로의 연결 확대"

그렇습니다.

결국 타이젠이 나올 수밖에 없습니다. :)


"오픈소스 활성화 및 개발자 교류를 위한 기회의 장 마련, 컨퍼런스 및 해커톤 등"


"오픈소스 확산을 위한 국내외 대학 과목, 세미나 운영"


아파치 부의장, David Nalley


"비영리 법인 아파치 재단"


"Meritocracy(실력주의), 프로젝트에 참여하는 사람이 결정한다"


"아파치 계층도 : 일반 유저 - 컨트리뷰터 - 커미터 - 프로젝트 매니져 - 멤버"


"모든 결정은 메일링 리스트로 이뤄진다"

"멤버의 지역이 제각각이므로 최소 72시간의 유예를 두어 의사를 결정한다"

"다수결로 결정된 사항을 거부할 수 있다. 다만 대안이 있어야한다."


"관대한 아파치 라이센스"


"아파치의 길"


"아파치 내부 프로젝트 168개"


"The Art and Science of Livecoding", Andrew Sorensen


http://extempore.moso.com.au/

앤드류는 즉석에서 비트가 넘실대는 연주를 시연했습니다.

이미 오스콘때도 라이브코딩으로 연주를 했었는데요,

한국에서도 그럴싸한 재즈를 보여/들려 주었습니다.

하나의 완결된 곡을 만들기 위해 도입부터 결말까지 디테일하게 코딩하더군요.

코딩과 음악을 연결한 시도가 굉장히 흥미로웠습니다.


"Back to the Future : 2015", 신정규님


"공유해도 코드 가치는 안 떨어집니다."

"세상엔 비슷한 삽질을 하는 사람들이 수없이 많습니다"


"8대 2의 법칙"(똥코드 vs 좋은 코드)


"프로젝트의 소스코드를 맹신해서는 안됩니다"


"오픈소스는 생각만큼 기여자가 많지 않습니다."


"git 프로젝트의 85%는 혼자 사용합니다."


"그래도 안 망하고 2년정도 알려지면 다양한 경험을 하게 됩니다"


"공공재로서의 도구 개발"


"예술가가 될 필요는 있습니다."


"오픈소스 활동은 취미로 할 것인지 일로 할 것인지 선택의 순간이 옵니다"


"구글은 스카이넷이야."


신정규 님은 오픈소스를 만들며 겪은 경험을 이야기해주셨습니다.

역시 자신이 직접 겪은 이야기를 사실감있게 풀어내는 발표가 재미있습니다.

참가자들의 반응도 굉장히 좋아서 중간중간에 빅웃음이 있었습니다.


"함께하는 즐거움", 김혜나양


"바느질회로 - 달팽이 라이트(기초회로)"


"오픈소스로 배워요"


"Git 오픈소스 마스터 획득"



김혜나양을 응원하고 싶다면 저 메일을 이용하시면 됩니다.

스팸방지를 위해 따로 적어놓진 않겠습니다. :)


Brian Warner, 김혜나양, Linus Torvalds


김혜나양이 리누스에게 8개 정도의 질문을 하였습니다.

리눅스에 대한 질문(펭귄 포함)도 있었고,

git에 대한 얘기도 있었습니다.

사실 리누스는 이런 류의 질문을 수천번은 족히 받았을텐데,

어린 소녀가 하는 질문이라 그런지 더 성의껏 대답해주더군요.


세 명의 좌담회를 끝으로 오전 행사가 마무리되었습니다.

소스콘 주최측에서 참가자들에게 무료점심식사 쿠폰을 주어 IFC몰에서 점심을 먹었습니다.

사람이 제일 붐빌 시간인데다가

소스콘 참가자들로 식당들은 인산인해로 붐볐습니다.


오후 첫번째 세션을 준비하고 계시는 박영주 수석연구원님


"Tizen Applications", 박영주 수석연구원님


"좋은 성능으로 다양한 프로파일에서 동작하는 웹앱"


"네이티브 웨어러블앱 개발, 4시간 / 개발자 한 명"


"흥미로운 프로토타이핑, 10시간 / 개발자 한 명"


"발표가 끝난 직후 인터뷰에 임하고 있는 박영주 수석연구원님"


"HTML5와 Tizen을 이용한 웨어러블 프로그래밍", 서영진님


"Tizen과 IoT"


"디바이스의 시대, 플랫폼의 시대 그리고 서비스의 시대"


"웨어러블의 역사와 현재"


"타이젠 2012년 1월 1.0 베타 발표"


"갤럭시 시리즈와 웨어러블 디바이스와의 연동"


"기어 개발자 사이트, http://developer.samsung.com/gear"


발표 중인 서영진님


"Cross-Device Convergence", 장경아 수석연구원님


"타이젠 영역 확장 중!"


"더 많은 디바이스에서 더 많은 태스크를 꿈꾼다"


"타이젠 패스"


"패스의 종류, Action PASS / Contents PASS / Identity PASS"


"작동원리, Toss > Stream > Act"


"Identity PASS, TV 채널 선택권"


"Tizen PASS의 시작은 Toss"


"Stream으로 데이터를 나누기"


"각각의 디바이스가 액션을 결정"


"Contents PASS로 미디어를 나누기"


장경아 수석연구원님의 발표를 끝으로 오후 세션이 끝났습니다.

타이젠과 IoT의 접점이 늘 궁금했었는데요,

오늘로서 그 의문이 상당수 풀렸습니다.

(타이젠 개발자라고 해서 플랫폼 전체를 다 아는 것은 아니라는...)

타이젠 3.0으로는 좀 더 재미난 것들을 해볼 수 있겠네요.



오후 세션이 끝나고 BoF가 진행되었습니다.

BoF는 발표자와  참가자들이 간단한 다과를 즐기면서 소통을 하는 자리인데요.

"Tizen 개발자와 함께 Tizen 수다 한 판!" BoF에는 박영주 수석연구원님과 제가 발표자로 참가하였습니다.

Tizen 테이블 참가신청이 빨리 마감되어 다행이었습니다(휴...).

아무도 신청을 안하면 어쩌나 걱정했었는데 타이젠에 대해 관심을 가져주신 분들이 계셨습니다. :)

양인환님, 신헌섭님, 이영종님, 이영호님, 박준철님, 김성원님, 이주완님.

함께 해주셔서 감사합니다.


간단하게 쓰려고 했는데 괜히 길어졌네요.

긴 글 읽느라 고생하셨어요.


감사합니다.

끝_


+ 추가 : 포스팅을 하고 나서 다시 읽어보니 온통 감사하다는 말뿐이네요. 근데... 정말 고생하신 분들이 많아서 감사하다는 말을 도저히 뺄 수가 없더군요. 이 부분 널리 양해부탁드립니다.


+ 추가 : DevLab 행사와 관련하여 궁금하신 사항이 있으신 분들(참석자 or not)은 언제든지 질문을 주세요.


안녕하세요, 윤진입니다.


10/26(월) 콘래드호텔에서 SOSCON의 사전행사로 Tizen DevLab을 개최하였습니다.

SOSCON Tizen DevLab에 대해서는 이전에 포스팅 한 번 했었는데요,

웹앱과 네이티브앱에 대한 세션을 오후 2시부터 6시까지 마련하였습니다.



발표 리허설을 위해 오전에 서둘러서 출발하였습니다.

9시 7분에 집 지하주차장에서 출발했는데 호텔 주차장에 도착하니 9시 15분이더군요.

평소에는 서울에서 수원으로 출퇴근했기에 출퇴근길이 항상 힘들었는데요,

오늘만큼은... 행복하네요.

호텔 지하주차장에 설치된 모니터에서 소스콘 행사 안내를 볼 수 있었습니다.

"Samsung Open Source Conference Grand Ballroom (3F)"



DevLab이 열린 곳은 콘래드 호텔 6층입니다.

밖이 훤히 보이는 투명한 엘리베이터를 타고 6층으로 올라왔습니다.

엘리베이터 유리창 너머로 파크원 타워 건설 현장이 보였습니다.

건설 현장의 규모만 봐도 굉장한 높이의 빌딩이 올라갈 거라 쉽게 예상할 수 있었습니다.



DevLab 행사장으로 가는 길에 배치된 쇼파입니다.

한 번 앉으면 일어나기 힘들 정도로 포근한 쇼파였습니다.

행사 시작 전에 많은 개발자 분들이 앉아서 담소를 나누고 계시더군요.

한국 개발자 뿐만 아니라 외국 개발자들도 눈에 많이 띄었습니다.



행사장으로 향하는 복도입니다.

전체적으로 구름이 짙게 낀 날씨여서 그런지 실내도 많이 어두웠습니다.

하지만, 내부 인테리어는 전체적으로 중후하고 모던한 분위기였습니다.



중간 공간에 간식과 음료도 마련되어 있었습니다.

간식으로는 쿠키와 빵이 있었습니다.

누구나 먹고 싶은 만큼 가져가 먹을 수 있어서요,

신나게 집어먹은 기억이 납니다.



발표장 앞에 입간판이 세워졌습니다.

SOSCON 삼성 오픈소스 컨퍼런스의 튜토리얼 세션 2개가 나오네요.

Studio7에서는 IoTivity로 재미있는 세션이 이어졌고,

Studio4에서는 Tizen DevLab이 개최되었습니다.



DevLab을 위한 안내 입간판입니다.

14:00~14:30 [강의] 누구나 쉽게 만드는 Tizen Web Application by 강석현 연구원

14:30~15:50 [실습] 누구나 쉽게 만드는 Tizen Web Application by 손보연 연구원

15:50~16:10 휴식

16:10~16:40 [강의] 정교하게 만드는 Tizen Native Application by 윤진 연구원

16:40~18:00 [실습] 정교하게 만드는 Tizen Native Application by 이은영 연구원

전체적으로 위의 순서대로 진행하였습니다.

물론 다양한 변수가 있어서 꼭 위의 시간대로 진행이 되지는 않았습니다. :)



발표장 입구에 들어가자마자 사진을 찍었습니다.

SOSCON 삼성 오픈소스 컨퍼런스 화면이 크게 보입니다.

Studio4에 천장에 내장된 프로젝터 화면이 작아서 큰 화면을 출력할 수 있게 따로 요청했었는데요,

새롭게 놓여진 프로젝트를 탁월한 선택이었단 생각이 듭니다.

DevLab은 코드가 주인공이기 때문에 저 정도가 아니면 소스가 제대로 안 보일 수 있거든요.

(DevLab 행사를 원활히 진행해주신 조재민 연구원님께 감사의 말씀을 드립니다.)



DevLab 행사를 위해 많은 분들이 고생해주셨습니다.

발표장 뒷편에는 원활한 행사진행을 위해 스탭분들이 대기해주셨습니다.

행사를 위해 묵묵히 고생하신 스탭분들께 감사의 마음을 전하고 싶습니다.



각 자리에는 콘래드 호텔에서 준비한 연습장과 볼펜이 놓여 있었습니다.

호텔에서는 종이와 연필을 챙기는 재미가 쏠쏠한지라 '몰래' 가방에 넣어왔습니다.



DevLab 행사 진행을 맡은 박문경 연구원입니다.

전체 행사진행 뿐만 아니라 Native Application의 튜터로도 활약했습니다.

매끄러운 진행을 위해 스크립트도 손으로 한땀한땀 써왔던데요,

공개적이고 형식적인 자리에 어울리는 진행을 해줘서 고맙습니다.

다음에도 진행을 부탁해야겠네요. :)



전체 트랙을 진행하기에 앞서,

타이젠 아키텍트이신 박영주 수석 연구원님께서 모두발언을 해주셨습니다.

타이젠 앱에 대해 간략하게 맥을 짚어주셨는데요,

더 자세한 내용이 궁금하시다면 내일 오후 소스콘 첫 세션(박영주 수석연구원, "Tizen Applications")을 들으시면 됩니다.



타이젠 웹앱 세션에서 강의를 진행하신 강석현 연구원님입니다.

발표장 앞에 있는 입간판에서 포즈를 부탁드렸는데요,

저런 익살스런 포즈를 취하신걸 제 손가락이 놓치지 않았습니다. 우후후.

강석현 연구원께서는 왜 웹앱을 해야하는지 충분히 납득가능한 설명을 해주셨습니다.

중간에 네이티브앱에 대해서도 살짝 언급해주셨는데요,

'개발자가 불에 타고 있는 이미지'를 재미난 이모티콘 이미지를 보여주시며,

제 3의 플랫폼이 개발자를 힘들게 한다는 충격요법으로 포문을 여셨습니다.

그리고 타이젠 플랫폼 뿐만 아니라 다른 플랫폼에도 바로 이식하여 사용할 수 있는 웹앱을 강조해주셨지요.



웹앱 실습은 손보연 연구원께서 진행해주셨습니다.

맥북과 미리 나눠드린 TM1시료가 붙지 않아 여러 참가자 분들이 고생하셨습니다.

최신 OS X 버전 11에서 삼성 USB 통합 드라이버가 제대로 동작하지 않아 생긴 이슈입니다.

통합 드라이버를 빠른 시일내로 업데이트하여 맥북에서도 원활히 테스트할 수 있도록 준비하겠습니다.

타이젠 버전이 업그레이드될수록 IDE도 진화하고 있습니다.

아직 부족한 점이 눈에 띄실 수도 있습니다.

저희가 더 노력해서 더 쉽고 편하고 빠르게 사용할 수 있도록 하겠습니다.



웹앱 튜터로 활약해주신 김용국 연구원입니다.

웹앱 세션에서 여기저기 종횡무진 누비고 다니던데요,

고생 많으셨어요.

함께 고생한 김수필 연구원 독사진이 없어서 그 사진은 최하단의 단체사진으로 대체합니다.

(미안해요, 술필)



그리고 네이티브 세션을 진행했습니다.

(위의 사진은 윈도우 지존 문관경 연구원께서 찍어주셨습니다)

웹앱세션을 진행하며 참가자 분들이 SDK 설정 및 타겟 연결을 완료하셨기 때문에,

네이티브 세션은 상대적으로 SDK와 관련된 이슈가 적었습니다.


그리고 더불어 소스콘 주최측에서 여분의 노트북도 준비해주셨습니다.

노트북을 가져오지 않으신 분들

- 자신의 노트북에서 원활히 SDK가 돌아가지 않는 분들

20대가 넘는 노트북을 준비해서 모두 제대로 실습할 수 있도록 하였습니다.

이 자리를 빌어 노트북을 준비해준 임지혜 연구원님과 SDK와 관련하여 여러가지로 도움주신 이남기 연구원님 외 한 분(이름이 갑자기 생각이 안나네요)께 감사를 전합니다.


이번 네이티브앱 발표에서 다룬 주제는,

- Life cycle

- View (elm_naviframe APIs)

- Component (EDC)

- Launch (app_control APIs)

위처럼 구성되어 있었습니다.


네이티브 앱 세션이 아무래도 웹앱보다는 어려웠을 것이라 생각하는데요,

세션을 더욱 쉽게 준비하지 못한 부분은 모두 제 책임입니다.

타이젠 네이티브앱을 구성하는 핵심요소를 모두 보여드리겠다는 욕심이 과했을지도 모르겠네요.

다음 행사에서는 개발자분들께서 더 쉽게 네이티브앱을 경험하실 수 있도록 준비하겠습니다.



네이티브앱 실습을 진행한 이은영 연구원님입니다.

샘플앱을 직접 작성하고 간결하게 설명하기 위해 바쁜 시간 쪼개가며 준비해주었습니다.

일정상 여러가지 많은 일거리가 있었는데,

불평없이 즐겁게 준비해주어 고마운 마음이 듭니다.



이번 데브랩을 준비한 멤버 모두입니다.

왼쪽부터 박문경 연구원 - 손보연 연구원 - 강석현 연구원 - 박영주 수석연구원 - 이근선 연구원 - 이은영 연구원 - 김수필 연구원 - 하이츨러 마스터 - 윤진 연구원입니다.

데브랩 네이티브 세션에 하이츨러 마스터님도 참석해주셨습니다.

하이츨러 마스터님께서는 세션발표 후 여러가지 실질적인 조언도 아끼지 않고 해주셨습니다.


구글러 서주영 연구원께서도 DevLab에 참석해주셨습니다.

서주영 연구원께서는 모레 있을 EFL 포럼에서 릴리즈와 관련된 세션을 진행할 예정입니다.

EFL 포럼에는 여러가지 재미난 이야기거리가 많이 준비되어 있습니다.

기대하셔도 좋습니다. :)


참가자 분들도 고생 많으셨습니다.

네 시간동안 웹앱도 하고 네이티브앱도 개발하느라 정신없으셨을 것 같네요.

발표하는 입장에서 봤을때는 모두 또렷또렷한 눈으로 따라와주셨는데요,

실제로는 어떠셨을지 궁금하네요.

어쨌든 부족한 발표 따라와 주셔서 감사합니다.


그리고 내일부터 소스콘 본행사가 시작됩니다.

이틀동안 알찬 세션이 많이 준비되어 있습니다.


개발자분들의 관심과 참여 부탁드립니다.

감사합니다.



소스콘 기간동안 흥미로운 몇가지 세션을 정리해봤습니다.

그 밖의 세션에 대한 모든 정보는 여기에서 얻어가세요.

소스콘 전야행사로 이뤄지는 타이젠 데브랩과 마지막날 개최되는 EFL 트랙은 필참입니다. :)



소스콘 첫째날 오전 스케쥴입니다.

아홉시에 콘라드 호텔에 가서 참가등록을 한 후,

10시부터 2시간 30분 동안 진행될 키노트를 들으면 되겠네요.



이번 행사를 기획한 팀이 센스가 넘쳐서 꽤나 재미있는 키노트가 될 것입니다.

콘서트프로그래머인 Andrew Sorensen은 과연 어떤 것을 보여줄까요?

그리고 김혜나 꿈나무 오픈소스 개발자와 스페셜 게스트(리누스 토발즈)가 이색적이네요.




점심식사 이후에 열리는 세션 중에 타이젠에 대한 세션이 있습니다.

세션제목 : Tizen Applications


오픈소스 플랫폼인 타이젠은 모든 디바이스를 연결하여 하나의 세상을 만들고자 합니다. 현재까지 모바일, 웨어러블, TV에 성공적으로 타이젠을 이식하여 멀티 프로파일 플랫폼으로서의 가능성을 확인하였습니다. 더불어 타이젠은 생태계 활성화를 위해 웹앱과 네이티브앱을 위한 개발환경을 견고하게 구축하고 있습니다. 개발자들은 앱의 성격에 맞게 개발방법을 선택하여 다양한 환경, 다양한 기기에서 유연하게 동작하는 앱을 개발할 수 있습니다. 타이젠 웹앱과 네이티브앱의 핵심 동작원리와 필수개념을 비교해보며, 앱개발방법에 대한 이야기를 해보겠습니다.


타이젠 앱에 대한 정보를 얻고 전략을 세우시려면 본 세션이 도움이 될 겁니다.

모바일 / 웨어러블 / 티비에서 개발하는 앱의 단편들을 엿보실 수 있습니다.




두번째 세션으로 제가 택한 것은 삼성전자 홍문기 책임연구원께서 진행할 세션입니다.

세션제목 : IoTivity: Cloud Native Architecture and the Internet of Open Source Things


The Internet of Things is the most recent buzzphrase, and like “Cloud” before it has only a vague definition. Different people will give you different answers if you ask them what either of them are. Yet one thing is for certain: the Internet of Things is based on open source software and open standards.

In 2014, two related entities were created to address IoT problems: IoTivity and the Open Interconnect Consortium. OIC is a standards group, an alliance of companies uniting to create the communications protocol to power all types of exchanges between devices, things, and the cloud; where IoTivity is an open source collaborative project hosted by the Linux Foundation, aimed at implementing those protocols.

This session will give an overview of what the various interpretations of the Internet of Things actually are, and the technologies behind them. It will talk about the IoTivity project, what it is trying to solve, and how it is going about that, including its governance structure and especially its unique relationship with the Open Interconnect Consortium. In the process, the audience will learn what challenges the new “Things” world poses, and will hopefully be inclined to contribute to the joint efforts that are trying to solve them.


IoTivity와 Open Interconnect Consortium 간에 벌어지는 이야기를 들을 수 있겠네요.

Cloud처럼 여기저기서 들려오지만,

IoT의 실체는 베일에 쌓여있으니 이번 기회에 명확히 해야겠네요.




서영진 작가님께서도 세션을 하나 맡으셨습니다.

세션제목 : HTML5와 Tizen을 이용한 웨어러블 프래그래밍


2014년 2월 매년 바로셀로나에서 열리는 MWC(Mobile World Congress)에서 삼성전자는 Gear2와 Gear2 Neo라는 Tizen 기반의 웨어러블 기기를 선보인다. 그리고 같은해 9월 독일의 가전제품 박람회인 IFA 2014에서 기어S를 발표하였다. 또한 2015년 9월 IFA2015에서 원형의 기어S2를 발표하면서 다시 타이젠의 웨어러블에 대한 전망을 밝게하고 있다. 본 세미나에서는 HTML5를 이용하여 타이젠 기반의 웨어러블 애플리케이션의 개발에 대해서 살펴보도록 하자.


타이젠 웨어러블 디바이스에 대한 관심은,

기어S2가 출시되고 나서 다시 뜨거워지고 있습니다.

웨어러블 개발방법론에 관심이 있으신 분은 서영진 작가님의 세션을 들어보세요.

지난 8월에 신사장에서 열린 타이젠 데브랩 앳 서울에서도 세션을 맡아해주셨는데요,

그 때는 서 작가님은 오전 세션을 하시고, 전 오후 세션을 했기에 뵙질 못했는데,

이번에는 꼭 인사라도 드려야겠네요. :)




첫째날 마지막 세션으로 삼성전자 장경사 수석연구원께서 발표하시는,

A synergetic Approach with Multiple Tizen Devices를 들으려고 합니다.


There has been an increased support for various profiles and devices on Tizen. As Tizen is a multi/cross platform, device integration will be the main factor of a fluid interface between devices. Whether it is Mobile, Wearable, or TV the scalability and usability will be accessible. These features will allow the users to gain: (1) Easy Access, (2) Content Mash-up, and (3) Multi Device Control. This presentation will introduce the "Tizen Pass" which cover Cross device User Experience & features of Tizen convergence service FW


매쉬업이나 멀티디바이스컨트롤은 멀티 프로파일을 가진 플랫폼이 고민해야할 이슈입니다.

그와 관련하여 가려운 곳을 장경아 수석연구원님께서 긁어주시겠네요.



그리고 둘째날이자 마지막날로 가보겠습니다.

둘째날은 키노트가 없기 때문에 오전 10시부터 바로 세션에 참여할 수 있습니다.




조만석 개발자님께서 Linux Kernel Boot Process 발표를 해주십니다.


IT를 하면서 리눅스는 많은 분들이 잘 알고 있습니다. 그리고 리눅스의 커널에 대해서도 많이 들어보았고, 커널이 중요하다는 것은 알고 있습니다. 리눅스 커널이 중요하다고 알고는 있지만 커널이 어려울것 같고, 어디서 시작해야 할지 몰라서 커널을 이야기 하는 사람은 적습니다. 리눅스 커널의 방대함으로 모든 것은 알기는 어렵지만, 중요하다고 말하는 커널을 알고자 하는 사람들을 위한 발표입니다. 리눅스 커널의 부트 프로세스를 통해서 전원이 들어왔을 때 하드웨어에서 리눅스 커널이 어떻게 메모리에 적재되는지부터 메모리, 인터럽트와 같은 커널이 사용하기 위한 자원을 초기화하는지, 그리고 프로세스를 위한 초기 동작을 소개하는 발표입니다.


리눅스를 늘 사용하고 관련서적도 수박겉핥기로 읽긴 했습니다만,

부트 프로세스에 대해 부담없이 들을 수 있는 세션같습니다.




Linux Kernel Boot Process와 같은 시간에 열리는 세션도 듣고 싶습니다.

세션 제목 : 아카 라이브러리와 리액티브 프로그래밍


멀티코어, 분산 컴퓨팅 환경이 보편적인 환경으로 자리잡고 있는 요즘 리액티브 프로그래밍이라는 방법론이 제시하는 철학과 속성을 설명한다. 그러한 방법론을 실제로 구현하기 위해서 아카 라이브러리가 어떻게 활용되는고 있는지 기술적인 내용을 소개한다.


어느 세션을 들을지 고민이 되네요.

출판예정인 "나는 프로그래머다" 책을 미리 구해서 사인이라도 받아야할까요? :)




10:50에는 삼성전자 이춘석 책임연구원께서 진행하실,

Introduction to IoT.js and Jerry Script를 들어보려고 합니다.


IoT.js는 초소형 IoT 기기를 고성능 스마트 기기, 웹 서비스 또는 클라우드와 쉽게 연동할 수 있도록 웹 표준 기술인 JavaScript를 기반으로 개발되고 있는 IoT open framework 이다. Web 상에서 다목적 플랫폼으로 널리 알려진 node.js 와 API 수준의 하위 호환성을 유지하여 기존 개발된 application/service를 쉽게 IoT에 활용할 수 있도록 한다. 이를 가능하게 하기 위해 작은 메모리에서 동작이 가능한 경량 JavaScript 엔진인 JerryScript도 새롭게 개발하였다. 본 세션에서는 IoT.js와 JerryScript의 최신 릴리즈 및 개발 현황에 대해 발표한다.


IoT를 위한 JerryScript에 대한 이야기를 들을 수 있겠네요.




박종백 변호사님의 세션도 굉장히 흥미롭습니다.

세션제목 : 실제분쟁에서 본 오픈소스 라이선스의 법리와 쟁점


2004년 독일에서 Harald Welte 대 Sitecom소송이 제기된 이래로 주로 독일,미국등 많은 나라에서 실제 분쟁이 발생하였는바 경고장이나 통고서로 법원외에서 진행된 것도 있고, 특정법원에서 소송으로 진행된 것들도 있는바 그 중 대부분의 사례들은 합의로 종결되어 왔고, 최근에 유럽의 Patrick McHardy가 유럽회사들을 상대로 제기한 분쟁과 Christopher Hellwig(Software Freedom Conservancy지원)가 VMWare를 상대로 제기한 라이선스 위반소송은 현재까지 진행중에 있다. 오픈소스 라이선스는 최초 개발자및 수정개발자가 자신들의 저작권에 기초하여 모든 이용자에게 차별없이 사용,복제,수정,배포할 수 있는 라이선스를 주는 구조이지만, 새로운 법적 쟁점들을 내포하고 있고, 라이선스를 적용함에 있어서 당면하게 되는 법적 쟁점에 대한 법적해석이 충분히 확립되지 않은 경우가 많아 어려움이 있다. 더우기 EPL같은 소수를 제외한 대부분의 라이선스는 준거법과 국제재판관할 규정을 두고 있지 않아 특정분쟁이 제기되면 과연 어느 나라법에 의하여 해석을 해야 하고,어느 나라법원에서 소송을 제기해야 할지 부터 법적판단이 필요한 경우가 대부분이다. 이번 컨퍼런스의 주된 청중인 개발자들을 포함하여 오픈소스 개발,제품화,공급 과정에 관여하는 모든 사람들에게 왜 오픈소스 supply chain에 있는 모든 관련자들이 오픈소스 라이선스를 준수해야 하고 라이선스 컴플라이언스 체계,절차를 만들어야 하는가 하는 이유를 좀더 생생하게 전달하기 위하여, 실제 분쟁사례에서 문제된 오픈소스 라이선스의 기본적인 법리와 라이선스를 위반하였을 때의 법적효과 내지는 위험을 전부 통틀어 체계적으로 재구성하여 설명하고자 한다. 라이선스의 사용빈도,기본 법리로서의 중요성, 향후 동종 쟁점의 반복가능성,위반의 효과의 중대성등을 고려하여, 15개 정도의 분쟁을 선정, 분석하여 문제된 특정 라이선스 조항, 기본쟁점에 대한 주요 법해석론(주요 국가별 법과 해석론의 구분포함)을 정리한다. 기본쟁점에는 준거법과 재판관할의 결정, 오픈소스 저작물의 저작권의 성질(예,공동or 결합저작물)과 제소권자,오픈소스 라이선스의 법적 성격(계약 또는 일방적 사용허락행위),copyleft의무의 발생요건으로서의 배포의 정의와 범위(배포에 미해당사례 포함), 저작권고지의 방법과 내용,소스코드의 제공방법과 범위,위반의 효과등이 있다.


소프트웨어 업계에 종사하는 분들은 모두 라이선스에 민감할 겁니다.

애써 개발한 소프트웨어가 제대로 빛도 보지 못하는 수가 생깁니다.

개발자들은 '미시경제학'에 대한 통찰 뿐만 아니라 기본적인 법률적 지식도 갖춰야합니다.

그에 대한 욕구를 채워줄 수 있는 세션이 되겠네요.




점심시간 직후인 14:00 부터는 한영주 책임연구원님의,

Open Source based Private Cloud for a Samsung Mobile Service 세션을 들어보려고 합니다.


전세계적으로 모바일 서비스를 위해 Public Cloud 뿐만 아니라 자체 Cloud를 구축하여 서비스를 제공하는 업체들이 많이 늘어나고 있다. 본 발표에서는 오픈소스 기반으로 개발한 자체 Cloud Infra에 대하여 소개하고, 성능 및 비용 효율적인 Private Cloud Infra 기술에 대해 발표합니다. 또한, 자체 Cloud Infra를 기반으로 삼성 모바일 단말에 탑재되어 있는 SVoice 서비스 구축 및 운영 경험에 대해 발표합니다.


위의 세션에서 언급하고 있는 '성능 및 비용 효율적인 개인 클라우드 인프라'에 관심 갑니다.

기기간 연결을 위한 하나의 중요한 끈이니 만큼 여러가지로 자극제를 얻을 수 있겠네요.




그 다음 세션에는 Chromium TIP에 대한 발표를 들어보려고 합니다.

세션제목 : Beginner 에게 알려주는 Chromium TIP


Chromium Open Source 커뮤니티에서 소스 받고 빌드하고 실행도 시켜보았다.. 그런데 찝찝하다... 뭐지.. 이 방대한 코드양 은? 코드를 보면 이해될꺼야.... 하지만 몇시간 후 좌절스럽다...

코드 타고타고... 어느 순간 여기는 어디고 난 이걸 왜 보고 있지?. 이런 막막함(?)을 조금은 덜어보자. 혹은 '다른 사람들은 뭔가 엄청난 방법으로 디버깅을 하고 있는데, 나 혼자 로그로 디버깅하고 있는건 아닐까?'라는 생각이 든다면, 한번쯤 살펴 보자. 한단계씩 디버깅해나가는 과정을 통해 이슈 해결에 근접해보자. 

커뮤니티에서 알려주지 않는 KNOWHOW 대방출! 놓치지마세요!

- Getting Start / Directory Description / How to debug / limitaion / Example


저같은 비기너를 위해 특화된 세션입니다.

커뮤니티에서 알려주지 않는 노하우를 대방출해주신다고 하니 녹음기라도 들고 가야겠네요. :)




그 다음 세션으로 16:00에 시작하는,

스타트업에서 사용하는 오픈 소스와 보안에 대한 세션을 들으려고 합니다.


• 소스가 오픈되어 있다고 보안적으로 우수할까?
• Open SSL - 하트 블리드 이야기
• 아무도 기여하지 않는 오픈 소스 커뮤니티
• 왜 해커들은 스타트업의 오픈 소스를 노리는가?
• 그렇다면 어떤 일을 해야하는가?


'아무도 기여하지 않는 오픈 소스 커뮤니티'나,

'그렇다면 어떤 일을 해야하는가?'에 대한 이야기를 듣고 싶습니다.




마지막 세션으로 16:50에 시작하는,

Introduction to GearVR Framework를 선택하였습니다.

GearVR이 갈수록 진화하고 있는 만큼 재미있는 이야기가 많겠네요.


Gear VR Framework 는 Virtual reality 를 시작하는 사람들을 위한 라이브러리입니다. 3D 개발 지식 없이 접근 가능하며 다양한 Extension 을 기본 제공해줍니다. 이에 대해 소개해드리고, Open source 로의 참여를 부탁드리고자 합니다.


위에 언급한 세션은,

타이젠 개발자로서 지극히 개인적인 관심으로 선별하였습니다.

위에 언급된 세션 외에도 들을 만한 세션이 많아서 고민이 됩니다.

아... 언급되지 않은 세션발표자 분이 이 글을 보시면 서운해하실 수도 있겠네요.

미리 죄송합니다!


그럼 소스콘때 뵙겠습니다~

끝_





안녕하세요, 타이젠 개발자 윤진입니다.


EFL을 사용하여 화면을 구성할 경우,

Elementary에서 제공하고 있는 위젯을 사용할 수 있습니다.


수많은 위젯 중 elm_label이나 elm_button과 같이 텍스트가 내제된 위젯도 있는데요,

그럴 경우 elm_object_text_set() 함수로 텍스트를 지정할 수 있습니다.


하지만 색상은 어떻게 지정해야할까요?

색상은 <color> 태그에 컬러값으로 16진수 RGB 값을 설정해주시면 됩니다.


예를 들어 입력하고자 하는 텍스트가 "Yes"라고 하면,

"<color='#00FF00'>YES</color>"

위처럼 태그를 사용하면 되겠죠.


버튼을 하나 만들어서,

붉은색으로 Red라는 텍스트를 넣어보겠습니다.


	Evas_Object *btn = elm_button_add(conform);
	if (!btn) {
		_E("Cannot add a button");
	}

	elm_object_text_set(btn, "<color='#FF0000'>Red</color>");

	evas_object_resize(btn, 400, 100);
	evas_object_move(btn, 40, 100);
	evas_object_show(btn);


위의 코드를 실행해보면,

아래와 같이 붉은색 글자를 보실 수 있습니다.



아주 간단한 팁이었습니다.

그럼 좋은 하루 보내세요~


안녕하세요, 윤진입니다.


어제는 소스콘 튜토리얼 트랙으로 타이젠 데브랩 행사에 대해 소개했었는데요,

오늘은 소스콘 컨퍼런스 트랙 중 하나인 EFL 포럼을 소개해볼까 합니다.



EFL 포럼은 소스콘 마지막 날인 10월 28일(수)에 열립니다.

오전 10시 30분부터 오후 5시 50분까지 총 10개 세션이 준비되어 있습니다.

처음 두 개 세션만 40분이고 나머지 세션은 30분 단위로 되어 있습니다.

다양한 주제가 모두 다뤄지는 만큼 30분 내지는 40분이 길게 느껴지지 않을겁니다.



EFL 한국커뮤니티에 올라와 있는 포스터입니다.

그동안 EFL은 독자적으로 세미나를 진행해왔고 올해로 3년이 되었습니다.

올해는 소스콘과 함께 개최되는 만큼 여느때보다 더 북적될 거라 기대하고 있습니다.


타이젠 플랫폼은 UIFW으로 EFL을 사용하고 있기 때문에,

타이젠 플랫폼 개발 혹은 타이젠 네이티브앱 개발에 관심있는 분들은,

EFL 트랙 하나하나를 놓쳐선 안됩니다. :)


첫 세션을 맡은 박춘언 책임 연구원께서는,

곧 배포될 Tizen 2.4 SDK에 올라간 EFL의 신규기능을 전체적으로 짚어주실 겁니다.

신규기능이란 것이 결국 더 편리하고 더 유려한 기능일테니,

잘 들어두면 개발에 직접적인 도움이 될 겁니다.


박진솔 연구원께서는,

Enventor를 '주'로 사용하여 만든 게임개발방법을 소개해주실 예정입니다.

Enventor의 업그레이드된 모습을 기대해주세요.


서현수 연구원께서는,

타이젠 SDK에 탑재된 UI Builder를 소개해주실 예정입니다.

UI Builder를 사용하여 WYSIWYG으로 소스코드를 생성할 수 있습니다.


이우찬 연구원께서는,

Elementary 위젯에 대해 포괄적인 정보를 공유해주실 예정입니다.

Elementary의 구성을 알아두면,

위젯의 스타일을 손쉽게 변경할 수 있습니다.

커스터마이징에 관심이 있다면 이 세션이 도움이 될겁니다.


그리고 다음 14:00 세션이 메인이죠(네네, 그러려니 해주세요;).

제 세션에서는 EFL 앱 개발에 사용하고 있는 여러가지 테크닉을 공유해드릴 예정입니다.

총 10개의 팁을 준비해두었고,

5개의 메인팁에 대해 집중적으로 발표할 예정입니다.

대략의 꼭지는 아래와 같습니다.


- Manage Data

- Manage Memory

- Manage Performance

- Manage Object Size with min & relative

- Manage Event


- Use Recalculate

- Use Offset

- Use Border for Nine Patch

- Use Repeat Events

- Use Color Class


위의 10개의 꼭지 중 Manage 항목이 중요하다고 여겨져서,

Manage 항목 5개 위주로 발표할 예정입니다.

정말 만에 하나 시간이 허락한다면,

Use 항목에서도 하나둘 발표할 예정입니다.

네이티브앱을 개발하시려면 꼭 들어주세요(굽신굽신).


점심시간 직후라 자칫 잘못하면 숙면실이 될 수도 있겠네요.

뭔가 재미난 얘기를 많이 넣어야겠어요!


Jean Phillippe Andre 연구원께서는,

이미지 마스킹과 필터에 대해 발표하실 예정입니다.

이전 EFL에서는 Rectangle로만 마스킹을 해야했었는데요,

Gear S2 등이 나오면서 이미지로도 마스킹을 할 필요가 생겼죠.

그래서 이미지 마스킹 기능이 새로 추가되었습니다.


엄지용 연구원께서는,

EFL에 도입된 OOP 개념에 대해 발표해주실 예정입니다.

EO가 아직 개발자단까지 피부로 와닿는 개념은 아닌데요,

Elementary 소스에는 굉장히 광범위하게 사용되고 있습니다.

EFL 소스를 분석하고자 한다면 EO에 대해 필히 알아두어야 합니다.


SubhransuSekhar Mohanty 연구원께서는,

벡터 그래픽에 대해 발표해주실 예정입니다.

보다 동적이고 자유로운 Visual Interaction을 위해 Ector를 사용할 수 있습니다.


서주영 구글러께서는,

EFL 릴리스를 하며 겪은 시행착오를 발표해주실 예정입니다.

오픈소스 배포에 대한 어려움을 직접 들을 수 있습니다.


하이츨러 EFL 창시자께서는,

EFL 신규로 도입된 디버깅 프로파일러에 대해 공유해주신다고 합니다.

디버깅 프로파일러의 부재가 항상 아쉬웠었는데요,

이번 세션을 열심히 듣고 장차 열심히 써먹어야겠습니다.


이상 총 10개 세션에 대한 개인적인 의견을 언급해보았습니다.

여러분이 놓치지 말아야할 세션은,

점심시간 이후 오후 2시에 열리는 세션이란 것만 기억해주세요;


포럼에 참석하시는 분들께,

박춘언 책임 연구원께서 직접 디자인한 티셔츠도 받으실 수 있습니다.


그럼 그 날 뵙겠습니다.

끝_










+ Recent posts