728x90
반응형

서버를 구성하는데 mediainfoffmpeg을 설치할 필요가 있었다.

 

설치할 서버가 적을 경우 하나씩 해도 되지만 서버가 많을 경우 일일이 하는 것이 어렵다.

 

이를 쉽게 하기 위해 자동화 도구 중에 하나인 Ansible을 사용했다.

 

많은 명령어들을 지원하는데 yum으로만 진행하여 다음과 같이 설정 파일을 만들었다.

- hosts: "{{ host }}"
  tasks:
  - name: install epel-release
    yum:
      name: epel-release
      state: present
    become: yes
    become_user: root
  - name: localinstall rpmfusion-free-release-7
    yum:
      name: https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm
      disable_gpg_check: yes
      state: present
    become: yes
    become_user: root
  - name: install mediainfo
    yum:
      name: mediainfo
      state: present
    become: yes
    become_user: root
  - name: install ffmpeg
    yum:
      name: ffmpeg
      state: present
    become: yes
    become_user: root

stateyum과 같이 사용하는 값인데 absent, installed, latest, present, removed이 있다.

 

present, installed, latest는 설치를 진행하고 absent, removed는 패키지를 제거한다.

 

becomebecome_user를 사용하여 사용자를 전환할 수 있으며 become_userroot가 기본값이다.

 

yum 프록시 설정이 필요한 경우 yum.conf를 수정해야하는데 lineinfile을 사용하여 쉽게 수정할 수 있다.

 

- hosts: "{{ host }}"
  tasks:
 - name: proxy added to /etc/yum.conf
    lineinfile:
      path: /etc/yum.conf
      regexp: 'proxy='
      insertafter: '\[main\]'
      line: 'proxy=proxy_addr'
      state: present
    become: yes
    become_user: root

regexp는 찾으려는 문자열의 정규식이며 insertafter에 해당 문자열 다음에

 

statepresent인 경우 line의 값을 추가한다.

 

stateabsent, present가 있는데 absentline을 제거하고 present는 추가한다.

 

참고 문헌

  1. https://linuxize.com/post/how-to-install-ffmpeg-on-centos-7/

  2. https://docs.ansible.com/ansible/latest/modules/yum_module.html

  3. https://docs.ansible.com/ansible/latest/modules/lineinfile_module.html

반응형
728x90
반응형

또 앱이 삭제됐다.

 

이번에도 "앱, 타사 광고, 기기 기능 방해 정책 위반 처리"로 인해 삭제됐다.

 

그래서 앱 시작과 동시에 전면 광고가 나오지 않도록 했다.

 

대신에 아이콘은 클릭했을 때 전면 광고가 노출되도록 변경해서 제출했다.

 

제출하고 하루가 지나서 앱이 다시 정상적으로 플레이 스토어에 노출된다는 메일을 받았다.

 

그러나 몇시간 뒤 다시 같은 이유로 삭제됐다.

 

도대체 무엇이 문제인가 싶어 찬찬히 코드와 광고가 나오는 타이밍 등을 살펴보려 했다.

 

광고가 나오는 타이밍을 보려고 테스트 광고 ID로 해봤지만 삭제돼서 그런지 광고가 나오지 않았다.

 

그러다 스택 오버플로우에서 이 이슈를 해결할 수 있을 것 같은 방법을 찾았다.

 

해당 내용에서 이 이슈가 발생하는 이유는 앱이 백그라운드에 있을 때

 

(광고를 보여주지 않아도) 광고 소재를 호출하는 것만으로도 위반으로 판단하기 때문이라고 했다

 

앱에서 전면 광고를 미리 불러오는데 constructor에서 수행하고 있었다.

 

디버깅을 해보니 앱이 백그라운드로 넘어갔을 때도 호출하는 것을 확인할 수 있었다.

 

그래서 AppState 확인하는 부분에서 처리해보려고 했는데

 

background에서 active일 때는 잘 됐지만 active 상태가 유지되는 경우엔 동작하지 않았다.

(상태가 변경돼야 동작하기 때문)

 

어떻게 하면 두 상황 모두 가능하게 할 수 있을까 하다가setTimeout으로 쉽게 해결할 수 있었다.

 

일정 시간 동안 앱이 active면 불러오고 시작과 동시에 백그라운드로 넘어갔을 때는 불러오지 않는 것을 확인했다.

constructor() {
  setTimeout(() => {
    if (this.state.appState) {
      interstitial.load();
    }
  }, SLEEP_TIME);
}

_handleAppStateChange = nextAppState => {
  if (this.state.appState.match(/inactive|background/) && nextAppState === 'active') {
    interstitial.load();
  }
  this.setState({ appState: nextAppState });
};

이번에는 꼭 제발 성공하기를 빌었고 이틀 정도가 지나 다시 정상적으로 등록됐다는 메일을 받을 수 있었다.

 

참고 문헌

  1. https://stackoverflow.com/questions/57251947/uncaught-exception-thrown-by-finalizer-all-webview-methods-must-be-called-on-th/57308639#57308639

반응형
728x90
반응형

신규 서버를 만들면서 두가지 기능이 필요했다.

 

첫째는 명령어를 동시에 실행해서 속도를 높이는 것과 데이터가 있는 디렉토리를 제거하는 것이었다.

  1. 명령어 동시 실행하기

Golang에서 WaitGroup은 모든 goroutine이 종료될 때까지 기다린다.

 

채널을 통해서 커맨드를 전달하고 goroutine에서 이 커맨드를 실행하고 종료한다.

 

명령어를 단순 반복문으로 수행하면 오래 걸리지만 이를 활용하면 빠르게 수행할 수 있었다.

tasks := make(chan *exec.Cmd, 64)
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
    wg.Add(1)
    go func(w *sync.WaitGroup) {
        defer w.Done()
        for cmd := range tasks {
            out, err := cmd.Output()
            if err != nil {
                fmt.Println("can't get stdout: %v", err)
            }
            fmt.Println(string(out))
        }
    }(&wg)
}
for i := 0; i < 10; i++ {
    tasks <- exec.Command("echo", strconv.Itoa(i))
}
close(tasks)
wg.Wait()
  1. 디렉토리 제거(rm -rf)

간단하게 exec.Command를 활용하면 되겠지만 최대한 Golang 함수로 해결해보려고 했다.

 

그래서 아래와 같이 디렉토리 밑의 데이터를 지우고 마지막으로 디렉토리를 삭제하도록 했다.

func removeContents(dir string) error {
    d, err := os.Open(dir)
    if err != nil {
        return err
    }
    defer d.Close()
    names, err := d.Readdirnames(-1)
    if err != nil {
        return err
    }
    for _, name := range names {
        err = os.RemoveAll(filepath.Join(dir, name))
        if err != nil {
            return err
        }
    }
    syscall.Rmdir(dir)
    return nil
}

 

참고 문헌

  1. https://stackoverflow.com/questions/40247726/go-execute-a-bash-command-n-times-using-goroutines-and-store-print-its-resul

  2. https://stackoverflow.com/questions/33450980/how-to-remove-all-contents-of-a-directory-using-golang

반응형
728x90
반응형

갑작스럽게 앱이 삭제됐다.

"앱, 타사 광고, 기기 기능 방해 정책 위반 처리" 으로 검색을 해봤다.

 

여러 가지 많은 결과들이 있었지만 같은 경우가 잘 없어 어떻게 대처해야할지 몰랐다.

 

메타 데이타나 정책 설정 문제인듯 싶어 관련된 것들을 수정했다.

 

하지만 거부됐다는 메일을 다시 받았다.

 

앱 버전을 올려서 제출하면 될 수도 있다는 말이 있어 해봤지만 역시 거절당했다.

 

예전에 개인정보처리방침으로 삭제된 적이 있어 이를 다시 업데이트해봤지만 소용없었다.

 

그래서 문서를 다시 읽어 봤다.

혹시나 하는 생각에 전면 광고를 앱이 실행 중일 때만 나오도록 수정하려고 했다.

 

이를 위해서 앱이 활성 상태인지를 확인하는 것이 필요했는데 다행히 React Native에서 지원했다.

 

AppState를 사용해서 쉽게 현재 상태가 active인지 background인지를 알 수 있어

 

이를 사용해 백그라운드로 변경되는 경우 광고가 나오지 않도록 수정해서 제출했다.

is live in the store.

다행히 다시 정상적으로 등록됐다는 메일을 받았다.

 

참고 문헌

  1. https://stackoverflow.com/questions/54981212/react-native-how-to-detect-home-button-is-pressed-or-not

  2. https://reactnative.dev/docs/appstate

반응형

+ Recent posts