'전체 글'에 해당되는 글 171건

  1. 2017.11.06 [삽질경험] crash at com.android.tools.profiler.support.ProfilerService.<clinit>(ProfilerService.java:44)
  2. 2017.09.12 [FFMPEG] Command 사용법 및 예제 10
  3. 2017.05.17 Google AAD - 구글에서 인증한 안드로이드 개발 자격증
  4. 2017.05.12 android 6.0 권한관리 쉽게 적용하는 RxPermission 사용법
  5. 2017.04.23 2017 올리브 푸드 페스티벌 참관기 - odense

[삽질경험] crash at com.android.tools.profiler.support.ProfilerService.<clinit>(ProfilerService.java:44)

android 2017. 11. 6. 14:10

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Android Studio 3.0으로 업데이트를 하였는데.. 

구현단말기에서 아래와 같은 실행시 오류가 발생할때의 조치법. 


[crash callstack] 

D/dalvikvm: Trying to load lib /mnt/asec/[[packagename]]-1/lib/libsupportjni.so 0x41b13f30

E/dalvikvm: dlopen("/mnt/asec/[[packagename]]-1/lib/libsupportjni.so") failed: dlopen failed: cannot locate symbol "strtof" referenced by "libsupportjni.so"...

W/dalvikvm: Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lcom/android/tools/profiler/support/ProfilerService;

D/AndroidRuntime: Shutting down VM

W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x41659ce0)

E/AndroidRuntime: FATAL EXCEPTION: main

              Process: [[packagename]], PID: 7500

              java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "strtof" referenced by "libsupportjni.so"...

                  at java.lang.Runtime.loadLibrary(Runtime.java:364)

                  at java.lang.System.loadLibrary(System.java:526)

                  at com.android.tools.profiler.support.ProfilerService.<clinit>(ProfilerService.java:44)

                  at [[packagename]].App.<init>(App.kt:25)

                  at java.lang.Class.newInstanceImpl(Native Method)

                  at java.lang.Class.newInstance(Class.java:1208)

                  at android.app.Instrumentation.newApplication(Instrumentation.java:990)

                  at android.app.Instrumentation.newApplication(Instrumentation.java:975)

                  at android.app.LoadedApk.makeApplication(LoadedApk.java:509)

                  at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4446)

                  at android.app.ActivityThread.access$1500(ActivityThread.java:144)

                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)

                  at android.os.Handler.dispatchMessage(Handler.java:102)

                  at android.os.Looper.loop(Looper.java:136)

                  at android.app.ActivityThread.main(ActivityThread.java:5146)

                  at java.lang.reflect.Method.invokeNative(Native Method)

                  at java.lang.reflect.Method.invoke(Method.java:515)

                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732)

                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)


위에 빨간색으로 표시한 부분이 힌트이다. 


재현된 경우는 다음과 같은 순서로 하면 재현이 된다. 

Android API Level 20 이상인 경우에는 profile을 지원해서 profile이 켜진상태로 실행을 하고, 

다음에 Android API Level 20 이하인 ( 본인은  Android 4.4 기기 ) 단말기를 연결해서 실행하니 위와 같은 오류가 발생하면서 죽는다. 


해결방법은 간단하다. 

메뉴에서 Run -> edit run configurations 를 연다음에 아래화면과 같이 체크박스를 해제해주면 된다. 






:

[FFMPEG] Command 사용법 및 예제

개발 2017. 9. 12. 14:35

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

ffmpeg는 오픈소스이면서, 비디오/오디오 관련한 많은 기능을 제공하고 있으며, 성능또한 상당히 좋은 편이다. 

ffmpeg는 크게 4가지로 분류하면 다음과 같다. 


1. ffmpeg : command line 도구 ( 동영상 크기및 코덱을 변경하경 할수 있다. ) 

2. ffserver : 동영상 streaming을 위한 서버 

3. ffplay : SDL 이라는 오픈소스 기반으로 player를 해주는 컴포넌트 

4. ffprobe : 간단한 멀티미디어(동영상) 분석도구 


이중에서 가장 기본이되고 방대한것이 바로 ffmpeg command line 인데, 

이걸로 무엇을 할 수 있는지 알아 보자. 


[사전준비] 

각 OS별로 컴파일된 binary를 사용해서 command를 연습해 볼 수 있다. 

https://ffmpeg.org/download.html 에서 OS별로 선택해서 다운받으면 된다. source code를 다운받지 말고 빌드된 binary를 받으면 된다. 현재 최신버전은 3.3.3 입니다. 



[기본 cmd 구조] 

ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...


 * global_options 

  - 입력, 출력 파일에 모두 적용 되는 옵션 

  -y, -n 처럼 강제로 output을 덥어 쓸지 정하는 옵션이 있는데, 몇가지 없음. 


 * input_file_options & input_url  

  - input에 사용되는 옵션으로 -i 앞에 위치한다. 

  - input이 여러개가 사용될 경우, 각 옵션들은 각각 input에 적용된다. 


 * output_file_options & output_url 

  - output 파일이름과 옵션들. 

  - 출력을 많이 변경하므로 여기에 옵션이 많이 사용된다. 


 * 참고 : 기본문서 

  - https://ffmpeg.org/ffmpeg.html : 간단문서 

  - https://ffmpeg.org/ffmpeg-all.html : 자세한 문서 

  - https://trac.ffmpeg.org/wiki : ffmpeg 위키문서 (버그, 가이드, 기타등등 ) 



case study


 * mp4 파일에서 비디오 제거하기 ( = audio 추출하기 ) 

ffmpeg -i input.mp4 -vn output.mp4 

 - 입력파일로 input.mp4 파일을 지정 

 -an : disable audio recording

 이렇게 하면 input파일에서 오디오 track을  decode 하고, 다시 encode 하는 과정을 거치게 된다. 그래서 인지 audio bitrate가 127KBit/s 에서 71KBit/s으로 변경되었다. 오디오 트랙을 그대로 보존하고 싶으면 아래처럼 옵션을 추가하면 된다. 추가로 encode/decode 과정이 없어서 속도가 더 빠르게 된다. 

ffmpeg -i input.mp4 -acodec copy -vn output.mp4

- acodec copy : audio를 디코딩/인코딩 하지 않고 그냥 copy 하라는 의미 

ffmpeg 명령어중에 같은 의미이지만 alias로 여러가지 방식으로 표현이 가능한데, -acodec copy은 다음과 같이 여러가지 방식으로 표한할수 있다. 

-c copy : 코덱을 그냥 카피하라는 의미, 오디오 비디오 모두에 해당한다. 

-acode copy : 오디오코덱을 카피하라는 의미 ( -vcode 은 비디오라는 뜻 ) 

-c:a copy : 코덱인데 오디오라는 의미 ( -c:v 이면 비디오라는 뜻 ) 


동영상에서 음악을 mp3 형식으로 뽑아내고 싶으면 아래와 같이 할 수있다. 

ffmpeg -i input.mp4 -vn output.mp3

 output 파일의 형식을 mp3로 하면 내부에서 자동으로 디코딩을 한후에 mp3 코덱으로 인코딩을 수행한다. 아래의 명령과 같은 의미가 된다. 

ffmpeg -i input.mp4 -acodec mp3 output.mp3

위와 똑같고 명시적으로 encoding할 codec을 알려주었다. 


* mp4 파일에서 특정 구간만 짤라서 뽑아 보자. 

ffmpeg -i input_20s.mp4 -vn -ss 5 -to 10 -c copy ouput_5_10.mp4

 -ss 5 : 시작 위치를 지정한다. (즉, 5초부터 시작한다. )

 -to 10 : Stop writing the output at position ( 즉, 10초까지만 사용한다. )

20초짜리 동영상파일에서 비디오를 제거하고(-vn) 5초부터 10초까지의 audio 파일만 crop 하는 명령이다. 


* 끝부분을 부드럽게 crop 하기 위해서 fade out 효과를 주면서. 

ffmpeg -i input_60s.mp4 -to 30 -filter_complex "afade=t=out:st=28:d=2" output_fadeout.mp3

-to 30 : 처음부터 30초까지 짜르라는 의미

-filter_complex : 복합필터를 적용하라는 뜻 

"afade=t=out" : fade효과인데 타입(t)은 서서히 줄어드는 효과(out) 

st=28 : (startTime) 28초부터 시작해서 

d=2 : (duration) 2초동안

명령이 조금씩 길어지는데, 위의 설명을 천천히 보면 알 수 있다. 위에서는 처음부터 30초까지 짤르면서 fade-out 효과를 주었는데, 10초부터 30초까지 중간을 짜르면서 앞에 fade-in 효과를 추가하고 싶으면 어떻게 할까? 

ffmpeg -i input.mp4 -ss 10 -to 30 -filter_complex "afade=t=in:st=10:d=1,afade=t=out:st=29:d=1" output.mp3

점점 복잡해진다. ^^; 


* 오디오 파일을 반복해서 붙여 볼까? 

ffmpeg -stream_loop 1 -i input.mp3 -c copy output_loop.mp3

-stream_loop n : n번 반복하라는뜻, 0은 반복 없음. -1은 무한 반복

위에있는 stream_loop는 입력파일 앞에 추가한 input_file에 대한 옵션이다. ffmpeg는 입력을 받아서 출력으로 쓰는 형식인데, 입력은 반복해주면 출력결과가 반복(loop)이 되는 것이다. 


* 오디오파일1, 오디오파일2를 붙이고 싶으면? 

ffmepg -i "concat:input_1.mp3|input_2.mp3" output.mp3

-i 다음에 입력파일이 오는 위치인데, 이부분에 따옴표가 붙으면서 subcommand가 왔다. 

concat:file1|file2|file3...    형식으로 붙이고 싶은 많큼 파일을 붙일 수 있다. 


* 오디오파일과 비디오파일을 합쳐볼까? 

ffmpeg -i audio_only.mp3 -i video_only.mp4 -c copy ouput_mux.mp4

오디오만 있는 파일과 비디오만 있는파일 2개를 사용해서 하나의 동영상 파일로 만든다. 

2개의 입력파일 시간이 다를경우, 최종 output 길이는 긴 것으로 된다. 만약 비디오파일이 30초길이고 음악이 20초길이면 결과물 output을 play 해보면 20초까지는 동영상과 음악이 같이 나오다가 21초부터는 영상만 나오게 된다. 





:

Google AAD - 구글에서 인증한 안드로이드 개발 자격증

개발 2017. 5. 17. 00:10

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

2016년 google I/O에서 발표했다고 하는데요, 구글에서도 과거 MCSE 같은 인증 자격증 제도를 운영하고 있습니다. 

과거 Java의  SCJP 를 취득한다고 취업에 크게 도움이 되지 않았고, Microsoft의 MCSE 도 비슷했다. 우리나라의 정보처리기사 정도의 가치가 있을런지.. 


2017년 3월 14일 기준으로 61개국에서 322명이 취득했다고 하니, 그렇게 인기가 많은건 아닌거 같다. 개발 해보면 알듯이 개발 능력을 어떤 시험으로 책정하기가 어렵기에, 이런류의 자격증은 base-line을 검증하는, 즉 최소 이정도는 알고 있다는 의미정도를 부여할수 있다. 


구글에서는 AAD를 소개하는 동영상도 만들었다. 정확한 명칭은 AAD (Associate Android Developer) 인증프로그램이라고 한다. 


구글의 기술블로그에도 소개가 되어 있다. 

https://developers-kr.googleblog.com/2017/03/introducing-associate-android-developer.html


응시료가 149달라라고 하니 대략 15만원. 비싸구나. 그리고 시험에 응시하면 48시간동안 문제를 풀어서 제출해야 한다고 한다. 물어 보는 내용은 다음과 같다. 


테스트 및 디버깅

    로컬 JVM 유닛 테스트 작성 및 실행

    장치 UI 테스트 작성 및 실행

    문제 설명이 주어지면 실패를 복제하십시오.

    디버그 정보를 출력하려면 시스템 로그를 사용하십시오.

    애플리케이션 크래시 디버깅 및 수정 (포착되지 않는 예외)

    활동주기 문제를 디버그하고 수정합니다.

    뷰에 문제 바인딩 데이터 디버그 및 수정


응용 프로그램 사용자 인터페이스 (UI) 및 사용자 경험 (UX)

    응용 프로그램의 기본 화면과 탐색 흐름 모의

    UI, 백그라운드 작업 및 데이터 지속성 간의 상호 작용을 설명하십시오.

    XML 또는 Java 코드를 사용하여 레이아웃 만들기

    사용자 정의보기 클래스 만들기 및 레이아웃에 추가

    사용자 정의 응용 프로그램 테마 구현

    공통 위젯 그룹에 맞춤 스타일 적용

    RecyclerView 항목 목록 정의

    로컬 데이터를 RecyclerView 목록에 바인딩

    메뉴 기반 또는 서랍 탐색 구현

    응용 프로그램의 UI 텍스트를 다른 언어로 현지화하십시오.

    접근성을 위해보기에 내용 설명 적용

    사용자 정의보기에 접근성 후크 추가


기본 응용 프로그램 구성 요소

    응용 프로그램의 주요 기능 및 비 기능 요구 사항 설명

    레이아웃 리소스를 표시하는 활동 만들기

    백그라운드 스레드에서 로더를 사용하여 디스크에서 로컬 데이터 가져 오기

    로더를 통해 데이터 변경 사항을 UI로 전파

    알람을 사용하여 시간에 민감한 작업 예약

    JobScheduler를 사용하여 백그라운드 작업 예약

    서비스 내부 백그라운드 작업 실행

    비표준 작업 스택 탐색 (딥 링크) 구현

    외부 지원 라이브러리의 코드 통합


영구 데이터 저장소

    데이터베이스 스키마를 정의하십시오. 표, 필드 및 색인 포함

    응용 프로그램 전용 데이터베이스 파일 만들기

    단일 결과를 반환하는 데이터베이스 쿼리 작성

    여러 결과를 반환하는 데이터베이스 쿼리 작성

    데이터베이스에 새 항목 삽입

    데이터베이스의 기존 항목 업데이트 또는 삭제

    콘텐츠 공급자를 통해 다른 응용 프로그램에 데이터베이스 노출

    원시 리소스 또는 자산 파일 읽기 및 구문 분석

    사용자 입력에서 영구적 인 환경 설정 데이터 생성

    환경 설정 값을 기반으로 응용 프로그램 로직 토글


기술면접 자료로 사용해도 될것 같다. 

자세한 자료는 다음을 참고 

https://developers.google.com/training/certification/





:

android 6.0 권한관리 쉽게 적용하는 RxPermission 사용법

android 2017. 5. 12. 21:18

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

안드로이드 개발에도 점점 RxJava 를 많이 사용하고 있는데요, 

RxJava를 사용하고 있다면, mashmallow (android 6.0) 이상에서 구현해야 하는 권한 관리를 편하게 추가할 수 있습니다. 

 권한 설정 구현은 targetSdkVersion 23 이상으로 해서 빌드하면 반드시 구현해야 되는 항목입니다. 

targetSdkVersion 23


RxPermisstion을 적용하는 단계는 다음과 같습니다. 


[ 설정 ] 

build.gradle에 다음과 같이 추가해 줍니다. dependencies 부분에.. 

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.tbruyelle.rxpermissions:rxpermissions:0.9.4@aar' // 이부분
testCompile 'junit:junit:4.12'
}

만약에 RxJava2를 사용하고 있다면..  아래 빨간 글씨처럼 2를 붙여주면 됩니다. 

dependencies {
    compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.4@aar'
}


[ 적용 ] 

1단계 

Activity의 onCreate() 에서 객체를 생성해 줍니다. 

public class CameraActivity extends BaseActivity {

RxPermissions rxPermissions;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.camera_activity_layout);
rxPermissions = new RxPermissions(this);

}


그런 다음에 필요한 권한을 요청하고 구독하면 됩니다. 

아래는 camera 권한을 요청하고  

사용자가 허가하면 ( granted ), 카메라를 열고

거절하면 alert을 띄워주는 흐름입니다.  

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.camera_activity_layout);
rxPermissions = new RxPermissions(this);


rxPermissions
.request(
Manifest.permission.CAMERA )
.subscribe(permission -> {
if (granted) {

openCamera();
}
else {
PermissionUtils.
alertPermission(this, Manifest.permission.CAMERA );

}
})
;
}


코드도 간략하고, 흐름도 너무 자연스러운게 좋습니다. 

그냥 구현하려면, 사용자 응답을 받는  onRequestPermissionsResult 함수에서 뭘하고, 해야 하다 보면 흐름이 이상해지는 경우나, 꼬이거나 해서 코드가 지져분해지기 쉬운데요, RxPermissions를 사용하면 너무나 쉽게 적용할 수 있습니다. 


request에 여러 permission을 동시해 요청할 수도 있습니다. 

여러 권한을 요청하면 granted 값은 모든 요청을 사용자가 동의한 경우이고, 하나라도 거절하면 false로 들어옵니다. 

rxPermissions
.request(Manifest.permission.READ_PHONE_STATE,
Manifest.permission.CAMERA,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_FINE_LOCATION
)


만약 여러권한에 대해서 개별적으로 응답을 받고 싶으면 request 대신에 requestEach를 사용하면 됩니다. 

rxPermissions
.requestEach(Manifest.permission.READ_PHONE_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_FINE_LOCATION
)
.subscribe(permission -> {
// 요청한 permission 수만큼 호출된다.
if (permission.granted) {

}
else {

}
})
;


그리고 어떤 권한이 있는지 확인 하기 위해서는 아래처럼 간단하게 호출해 볼수 있습니다. 

if (rxPermissions.isGranted(Manifest.permission.ACCESS_FINE_LOCATION)) {
// 위치정보 관련 작업
}


[ 사용시 주의사항 ]

권한요청중에 앱이 다시 시잘될 수가 있으므로, onCreate같은 초기화 함수에서 request를 처리해야 합니다. 절대로 onResume에서 사용하면 안됩니다. 


[Tip]

* RxPermissions 사용시 추가해야할 proguard 설정은? 없습니다. 



더 자세한 정보를 위해서는 개발자의 page에 직접 방문해 보세요. 

https://github.com/tbruyelle/RxPermissions





:

2017 올리브 푸드 페스티벌 참관기 - odense

여행&맛집 2017. 4. 23. 11:58

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

4월 22일 토요일 서울 올림픽 공원에서 올리브 푸드 페스티벌이 열려서 참석하고 왔습니다. 



사진처럼 엄청난 인파가 몰렸습니다. 

일단 올리브 푸드 페스티벌은 성공인듯 합니다. ^^; 


사람이 너무 많다 보니 유명한 음식점의 경우에는 줄이 너무 길어서 기본이 1시간이고 2시간을 기다려야 맛 볼 수 있는 곳도 있다보니.. 

입장하기전에 welcome kit(웰컴킷)이라고 박스를 하나 주는데, 아래처럼 음식을 받아서 먹는 상자 입니다. 

아무래도 음식먹을 테이블이 부족하니 이런 상자를 주면서 음식을 먹기 편하게 나름 배려한것 같네요.  


사람들이 음식줄에 서있는 동안 odense 라는 곳에서 음식사진을 이뿌게 찍어 보는 체험존을 운영하고 있길래 빠르게 참여해봄.. ㅋ 

odense는 중저가 그릇 업체라고 하는데, 이쁜것 같습니다.

  => odense 에서 여러 소품과 그릇을 세팅해놓고 사진을 찍을수 있게 만들어 놨습니다. 

     ( 음식사진을 그릇에 이쁘게 담는것을 플레이팅이라고 합니다. ) 

 

 => 역시 인스타를 통한 마케팅 이군요~ ㅋㅋ 


 => 약간의 다과 같은것을 나눠주면서 활용해서 사진을 찍어 보라고 합니다. ^^;  순진하게 시키는 대로 해봅니다. 


 => 아옹, 저 옆의 생수 물병 모야..  구도를 잘못 잡고 찍었습니다. 


역대 최대 규모로 열린것 같은 올리브 행사였는데요, 역시 유명한 여러 업체들이 있습니다. 


앞에서도 말했듯이 유명한곳에서 먹으려면 줄이 길다는 함정~~ 


그리고 olive TV가 CJ 계열이라서 그런지 다양한 홍보를 관련한 행사도 하고 있습니다. 

파란 왕 버튼을 두둘겨서 레벨 8에 도달해서 최고 상품인 쿠킷 3개를 받았습니다. 흐믓~~ 



   



: