Android2023. 5. 8. 11:22

내가 카메라로 촬영한 사진이나 영상을 다른 앱으로 보고자 하는 경우 이전에는 아래와 같이 하였다.

 

File file = new File('파일경로');
Intent. inetnt = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "image/png");
startActivity(intent);

하지만 안드로이드 10부터 Scopped storate모드가 지원되면서 안되기 시작하더니 이제는 그냥 안된되고 보면 될것 같다.

이젠 아래와 같이 호출해야 정상적으로 다른앱으로 내가 만든 사진을 볼수가 있다. 그것도 앱이 사용중에만.

File file = new File('파일경로');
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.sestDataAndType(
	FileProvider.getUriForFile(this, getPackageName()+".fileprovider", file),
    "image/png");
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(intent);

Uri.fromFile()이 아니라 FileProvider.getUriForFile(...)를 사용하였고 FLAG_GRANT_READ_URI_PERMISSION권한을 추가해 주었다. 이 권한은 호출한 앱의 테스크가 유지되는 동안 유지된다. 즉 앱이 종료될때까지 된다고 보면 될것 같다.

 

'파일경로'라고 되어 있는 부분은 아무 경로나 되는것이 아니며 일반적으로 개발자들은 sdcard에 저장하길 원할것이다.

앱패키지명이 'com.my.app'이라면 '/sdcard/Android/data/com.my.app/files'가 된다.

FileProvider에 대한 글은 많이 있기 때문에 자세한 설명은 하지 않고 만일 /image폴더에 저장하고 그 파일을 다른 앱으로 보고자 할 경우에는 아래와 같이 하면 된다.

 

AndroidManifest.xml

    <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="${applicationId}.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths" />
    </provider>

/res/xml/provider_paths.xml

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-files-path name="external_files" path="." />
</paths>

/sdcard/Android/data/com.my.app/files/image 폴더내의 sample.png파일은 아래와 같이 지정한다.

File file = new File(getExternalFilesDir("image") + "/sample.png");

이렇게 지정된 파일을 FilrProvider.getUriForFile()로 Uri를 얻어내어 Intent에 던져 주면 이미지파일을 열 수 있는 다른 앱이 이미지를 보여줄수 있게 된다.

 

provider_paths.xml에서 외부에 공유 가능한 폴더 목록을 지정하게 되어 있는데 external-files-path이외에 아래와 같이 추가로 지정할 수 있다.

 

files-path Context.getFilesDir()에 해당
cache-path Context.getCacheDir()에 해당
external-path Environment.getExternalStorageDirectory()에 해당
external-cache-path Context.getExternalCacheDir()에 해당
external-media-path Context.getExternalMediaDirs()에 해당

 

Posted by 삼스
카테고리 없음2023. 3. 14. 14:05

Gitlab으로 CI/CD가 가능한데 기본적인 사항을 정리해 보겠다.

 

Gitlab에 저장소를 만들고 .gitlab-ci.yml파일을 만들면 그 때부터 시작된다.

샘플은 https://gitlab.com/nanuchi/gitlab-cicd-crash-course 로 하겠다.

 

샘플프로젝트는 python으로 작성된 시스템모니터링정보를 제공하는 웹서비스이다.

.gitlab-ci.yml파일

variables:
  IMAGE_NAME: nanajanashia/demo-app
  IMAGE_TAG: python-app-1.0

stages:
  - test
  - build
  - deploy

run_tests:
  stage: test
  image: python:3.9-slim-buster
  before_script:
    - apt-get update && apt-get install make
  script:
    - make test


build_image:
  stage: build
  image: docker:20.10.16
  services:
    - docker:20.10.16-dind
  variables:
    DOCKER_TLS_CERTDIR: "/certs"
  before_script:
    - docker login -u $REGISTRY_USER -p $REGISTRY_PASS
  script:
    - docker build -t $IMAGE_NAME:$IMAGE_TAG .
    - docker push $IMAGE_NAME:$IMAGE_TAG


deploy:
  stage: deploy
  before_script:
    - chmod 400 $SSH_KEY
  script:
    - ssh -o StrictHostKeyChecking=no -i $SSH_KEY root@161.35.223.117 "
        docker login -u $REGISTRY_USER -p $REGISTRY_PASS &&
        docker ps -aq | xargs docker stop | xargs docker rm &&
        docker run -d -p 5000:5000 $IMAGE_NAME:$IMAGE_TAG"

 

variables는 스크립트내에서 사용되는 변수를 정의할 수 있다.

variables:
  IMAGE_NAME: nanajanashia/demo-app
  IMAGE_TAG: python-app-1.0

stage는 각 작업의 단계를 나타내며 순차적으로 수행이된다. 작업은 병렬로 처리되는데 같은 stage의 작업들 끼리만 병렬로 처리될 수 있으며 중간에 에러 발생 시 다음단계로 넘어가지 않는다. 샘플에서는 3개의 stage가 있으며 각각 run_tests, build_image, deploy 작업이 한개씩만 있다.

 

stages: // 스테이지 정의
  - test
  - build

run_tests:
  stage: test // run_tests는 test 스테이지
  ...

build_image:
  stage: build // build_image는 build 스테이지
  ...

run_tests 작업은 test stage이고 python docker image기반에서 make가 설치되어 있어야 하고 make test를 실행하여 테스트를 진행한다.

run_tests:
  stage: test
  image: python:3.9-slim-buster
  before_script:
    - apt-get update && apt-get install make
  script:
    - make test

build_image 작업은 도커이미지를 만들어서 Docker hub에 도커이미지를 push하는 작업까지 진행한다.

deploy 작업은 서버에 접속하여 docker image를 적용하고 서비스를 시작한다.

서버에 접속시 ssh로 접속하기 때문에 인증을 위해 key를 등록해주어야 한다.

 

gitlab에서는 개인키를 설정 -> CI/CD -> Variables에서 추가해 줄 수 있으며 위 예에서는 SSH_KEY로 등록된 예이다. SSH_KEY의 경우 파일이며 이때는 type을 File로 등록하면 된다.

Variables에 다른 Docker 로그인 계정과 비번도 등록해서 사용하고 있다. REGISTRY_USER, REGISTRY_PASS가 이 샘플의 예이다. 계정이나 비번을 스크립트에 노출시키지 않기 위해서는 이 방법을 추천한다.

Posted by 삼스
카테고리 없음2023. 2. 8. 15:57

chatGPT가 하도 핫 하길래 오늘 좀 놀아봤다.

개발자의 호기심으로 코딩을 좀 물어 봤는데 깜놀~

 

먼저 문제가 있는 코드를 주고 물어 봤다.

완전 놀랐는데..

놀란 이유는 오류를 찾았을 뿐 아리나 내가 memcpy의 src와 dest위치를 일부러 바꿔서 예시를 주었는데 그 부분도 수정이 되었다.

memcpy(src, dest)가 memcpy(dest, src, size)로 바뀐것이다.

이놈이 코드의 맥락까지 파악하는건가? 하고 놀래서 좀더 물어봤다.

 

swift code로도 훌룡하게 바꿔주었다.

한번더 물어보았다.

 

이건 좀 이상했다. dest를 src로 복사하고 있네...

그래서 내가 좀 지적했다.

 

코드는 맞게 수정되었는데 "아래 코드는 대상버퍼에서 원본버퍼로 복사하는것입니다."라고 대답했다. 대답이 틀렸넹.

쪼오금 부족했지만 참 대단한 넘이다.

간단한 코드 스니펫을 작성하거나 점검할때만 사용해도 코딩시간을 줄여줄 수 있지 않을까 싶다.

이게 더 똑똑 해지면 내 일이 없어지는건 아닐지.. 생각해 보게 되는데 이 부분에 대한 인사이트가 있는지 찾아봐야 겠다.

 

Posted by 삼스