카테고리 보관물: 미분류

PostgreSQL pg_restore 할 때 외래키(foreign key) 제약(constraints) 조건 무시하기

Ignore foreign key constraints when pg_restore

개발하다보면 개발서버 혹은 운영중인 DB 서버의 데이터를 이용해야 하는 경우가 있습니다. 이런 경우 PostgreSQL 에서는 pg_dump, pg_restore를 이용해 백업 및 복원을 진행합니다.

전체 DB를 백업하고 복원하는것은 어렵지 않지만 특정 테이블 하나만 적용하려고 보면 왜래키(Foreign key) 제약 조건으로 인해 복원이 실패하는 경우가 발생합니다. MySQL 의 경우는 외래키 제약 조건을 임시로 중단할수 있는 SQL이 있지만 PostgreSQL 에서는 여러가지 방법을 찾아 봤지만 모두 실패 했고 하나의 성공 방법을 찾았습니다.

monsters 라는 테이블을 운영 DB에서 받아와서 개발 DB에 반영 한다면 아래와 같은 절차로 진행합니다.

pg_dump 명령어를 이용해 monsters 테이블을 파일로 저장합니다.

$ pg_dump -W \
    -h DB_HOST \
    -p DB_PORT \
    -U DB_USER \
    -d DB_DATABASE \
    -F c -b -v \
    -t monsters \
    -f monsters.dump

개발 DB에 접속후 복원하려는 DB와 같은 이름을 가진 테이블을 삭제하는데 이때 cascade 옵션이 중요합니다.

$ psql -U local_db_user -d local_db_name -c 'DROP TABLE IF EXISTS monsters cascade;'

cascade 옵션은 다른 테이블에서 외래키로 참조하고 있는 제약 조건을 같이 삭제합니다. 실행하면 아래와 같이 외래키 제약 조건이 같이 삭제되었다는 메시지가 출력됩니다.

NOTICE:  drop cascades to 4 other objects
DETAIL:  drop cascades to constraint xxx on table regions_111
drop cascades to constraint yyy on table regions_222
drop cascades to constraint zzz on table regions_333
drop cascades to constraint qqq on table regions_444
DROP TABLE

마지막으로 pg_restore 명령어를 이용해 DB를 복원합니다.

$ pg_restore --no-acl --no-owner -U local_db_user -d local_db_name monsters.dump

복원시에는 --no-acl, --no-owner을 주어 원본 DB의 사용자에 할당되어 있는 권한을 제거합니다.

pg_restore 할때 --clean 옵션을 주면 굳이 DROP TABLE 을 따로 안해도 되지만 제약조건이 걸려 있는 경우 복원이 실패합니다. 이런 이유로 DROP TABLE을 복원 전에 실행하는것이 문제 해결의 키입니다.

게시글의 아마존, iTunes 링크들을 통해 구매를 하시면 제휴(Affiliate) 프로그램에 의해 저에게 일정 금액이 적립될 수 있습니다. ^_____^

윈도우 10 우분투에서 도커 설치하기

윈도우 10에 설치한 우분투에서 도커를 설치하는것이 쉽게 되지는 않습니다. 그냥 생각하기에는 우분투에 도커 설치하면 잘 될것 같지만 몇가지 설정이 필요합니다.

BIOS에서 하드웨어 가상화 옵션 활성화

윈도우에서 도커를 사용하기 위해서는 Hyper-V 설치와 하드웨어 가상화 옵션 활성화가 필요합니다. Hyper-V 는 윈도우 10에 리눅스를 설치하면서 자동으로 설치되고 활성화 되는것같아요.

하드웨어 가상화 옵션은 BIOS 에서 CPU 설정에서 가능합니다. Intel CPU는 VT-x, AMD CPU AMD-V(SVM)등의 이름으로 찾을수 있습니다.

제 컴퓨터는 Intel CPU를 사용하고 있었고 BIOS는 ASUS 제품인데 아래와 같은 화면입니다. 여기서 가상화 관련 옵션이 Disabled 되어 있는데 Enabled로 변경후 저장하고 컴퓨터를 종료합니다.(컴퓨터 재시작이 아니라 종료후 재시작을 추천하고 있습니다)

우분투와 윈도우에 도커 설치

우분투에서 도커를 사용하기 위해서는 윈도우 10과 우분투 모두에 Docker를 설치해야합니다.

이렇게 두개를 동시에 설치하는 이유는 우분투에만 도커를 설치할 경우 도커 데몬이 시작하지 않기 때문입니다. 윈도우에 설치한 도커는 도커 데몬 역할을 하고 우분투에 설치한 도커는 클라이언트 역할을 합니다. 우분투에서 실행한 도커 명령어는 윈도우에서 실행중인 도커 데몬에 전달되는 방식입니다.

윈도우와 우분투에 모두 도커를 설치 했다면 우분투 .bashrcDOCKER_HOST 환경변수를 윈도우 컴퓨터로 설정하도록 추가합니다.

export DOCKER_HOST='tcp://0.0.0.0:2375'

쉘을 재시작하거나 우분투를 종료후 다시 실행후 docker ps 등의 명령어를 실행해보면 잘 동작하는것을 확인 할 수 있습니다.

참고정보

게시글의 아마존, iTunes 링크들을 통해 구매를 하시면 제휴(Affiliate) 프로그램에 의해 저에게 일정 금액이 적립될 수 있습니다. ^_____^

윈도우 10 우분투에 ZSH 사용하기

윈도우 10 우분투의 기본 쉘은 BASH 입니다. 하지만 저는 평소에 zsh을 사용하고 있어서 zsh을 설치해보기로 했습니다.

zsh 설치는 간단합니다.

$ sudo apt-get install zsh

설치하고 나서 chsh 을 이용해서 기본 쉘을 bash 에서 zsh로 변경합니다.

$ sudo chsh -s which zsh

우분투를 재시작하면 기본 쉘이 zsh 로 변경한것을 확인 할 수 있습니다.

zsh 만 설치하면 아쉬우니 oh-my-zsh 도 설치합니다.

$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

문제점 수정

위의 방법으로 설치후 zsh 을 사용하다보면 백그라운드에서 프로세스를 실행하려고 하면 오류가 발생합니다.

$ test & 이런식으로 백그라운드에서 실행하려고 하면 오류가 발생하죠.

이 문제는 .zshrc 파일에 아래 내용을 추가하면 해결됩니다.

unsetopt BG_NICE

마지막으로

zsh 설정하면서 pure 라는 zsh prompt를 설치하지 못한것은 아쉽습니다. 평소에 사용하던거라 설치하려고 했는데 ZSH 5.2+ 이상을 요구 하고 있어서 설치하지 못했습니다. 윈도우 10 우분투에서는 apt로 설치하는게 5.1 버전까지 입니다. 직접 컴파일해서 설치 할 수도 있겠지만 그렇게까지는 하고 싶지 않았습니다.

참고정보

게시글의 아마존, iTunes 링크들을 통해 구매를 하시면 제휴(Affiliate) 프로그램에 의해 저에게 일정 금액이 적립될 수 있습니다. ^_____^

윈도우 10에 Ubuntu 설치 및 초기설정

윈도우 10에서 Bash를 지원하기로 했다는 소식을 들었던거 같은데 최근에 윈도우에서 사용해볼 일이 생겨서 설치하면서 생겼던 문제들과 해결방법을 적어보려고 합니다.

윈도우에서 Bash 지원하는것은 윈도우에서 리눅스를 실행하는 방식으로 변경되었습니다. 그래서 윈도우 10 최신 버전을 설치하고 윈도우 스토어에서 Ubuntu를 검색해서 설치하면됩니다. open SUSE도 설치 할 수 있지만 Ubuntu를 추천하고 있습니다.

설치 방법은 간단합니다. 윈도우 스토어에서 linux 혹은 ubuntu로 검색해서 나온 앱 목록에서 Ubuntu를 “다운로드” 하면 설치가 진행됩니다.

설치가 완료된후 Ubuntu 앱 아이콘을 시작메뉴에서 더블 클릭하면 터미널이 실행되면서 우분투로 진입합니다.

처음 실행하는 경우 위 화면과 같이 우분투에서 사용할 계정이름을 입력하라고 나오는데 여기서 사용하고 싶은 이름을 입력하면됩니다. 윈도우의 사용자이름과 동일할 필요가 없습니다.

생각보다 쉽게 우분투가 설치되었습니다 !

이제부터는 우분투를 잘 사용하기 위한 초기 설정에 대해서 주제별로 알아보겠습니다. 아래의 설정을 안해도 사용하는데 문제는 없지만 해두면 좋습니다.

터미널 색상 변경하기

윈도우에서 처음으로 우분투를 실행하고 ls 명령어나 vi 로 문서를 열어보면 파란색이 눈에 잘 안보이는것을 경험하게 됩니다. 단순히 불편한 문제를 넘어서 특정 문자열들이 잘 안보이고 이로인해 문제가 발생할 여지가 있습니다.

Ubuntu를 실행하고서 해당 앱 왼쪽 상단의 우분투 로고에 마우스 오른쪽 버튼을 누른다음 속성을 선택합니다.

속성창에서 “색”을 선택합니다.

“색”에서 중간쯤 보면 여러가지 색상이 박스로 표시되어 있는데요. 이 하나하나의 색을 슬롯이라고 했을때 총 16가지의 색상 슬롯이 있습니다. 이 각각의 슬롯을 선택하고 오른쪽 위에 “선택한 색 값”을 아래와 같이 변경합니다.

Slot 1: Red: 48, Green: 10, Blue: 36
Slot 2: Red: 52, Green: 101, Blue: 164
Slot 3: Red: 78, Green: 154, Blue: 6
Slot 4: Red: 6, Green: 152, Blue: 154
Slot 5: Red: 204, Green: 0, Blue: 0
Slot 6: Red: 117, Green: 80, Blue: 123
Slot 7: Red: 196, Green: 160, Blue: 0
Slot 8: Red: 211, Green: 215, Blue: 207
Slot 9: Red: 85, Green: 87, Blue: 83
Slot 10: Red: 114, Green: 159, Blue: 207
Slot 11: Red: 138, Green: 226, Blue: 52
Slot 12: Red: 52, Green: 226, Blue: 226
Slot 13: Red: 239, Green: 41, Blue: 41
Slot 14: Red: 173, Green: 127, Blue: 168
Slot 15: Red: 252, Green: 233, Blue: 79
Slot 16: Red: 238, Green: 238, Blue: 238

그리고 이제 왼쪽 상단의 “화면 텍스트” 를 선택하고 슬롯 16을 선택합니다. 이런식으로 “팝업 배경”은 슬롯 16, “화면 배경”, “팝업 텍스트”는 슬롯 1로 선택하고 확인 버튼을 클릭합니다.

터미널 색상이 이쁘게 바뀐게 확인되나요? 가독성이 떨어지던 파란색도 이제 잘 보입니다 ^^

디렉토리(폴더)의 배경 색상지우기

위에 ls 결과를 보면 뭔가 마음에 들지 않는게 있지 않나요? 그건 바로 폴더 이름에 녹색 배경이 들어가는 겁니다. 가독성도 떨어지고 굳이 폴더를 이렇게 중요하게 표시해야되나 싶을텐데요.

배경에 색상이 들어가게 보이는건 해당 폴더의 권한이 모든 사용자가 폴더에 쓰기 권한을 가졌기 때문입니다. 모든사용자에게 쓰기 권한이 열려있을 경우 다르게 보이게 하려고 이런식으로 표시됩니다.

그런데 윈도우 우분투를 사용하는 경우 폴더를 만들거나 git clone 을 하는등 모든 폴더를 만들때마다 쓸데없이 모든 사용자들이 쓰기가능한 상태로 만들기 때문에 보안측면에서도 안좋고 보기에도 안좋은 문제가 발생합니다.

.bashrc 파일을 열어서 아래와 같이 umask를 설정하면 해결됩니다.

if [[ "$(umask)" == '000' ]]
then
   umask 022
fi

이제 우분투를 종료후 재시작하거나 쉘을 재시작 하면 폴더를 생성할때 권한이 제대로 설정되고 ls 했을때 배경색이 보이지 않는것을 확인할 수 있습니다. 기존에 이미 생성된 폴더의 경우는 권한을 변경해야합니다.

참고로 이 설정은 우분투에서만 동작하며 윈도우 파일시스템(/mnt/c 같이 윈도우 파일시스템 마운트 된곳) 밑에서는 여전히 777 퍼미션으로 폴더가 생성됩니다.

마지막으로

윈도우에서 우분투가 된다고 해서 기대를 많이 했지만 맥에 익숙해져있던 제가 윈도우에서도 개발을 쉽게 하기에는 아직 많은 장벽들이 있네요. 키보드도 그렇고 윈도우에서 직접 실행할때보다는 덜하지만 개발툴 설정등… 위에 정리한것 말고도 여러가지 문제들이 있는데 차차 블로그 포스트를 통해 전달드리겠습니다.

참고자료

게시글의 아마존, iTunes 링크들을 통해 구매를 하시면 제휴(Affiliate) 프로그램에 의해 저에게 일정 금액이 적립될 수 있습니다. ^_____^

GitHub 프로젝트의 의존성 정보를 알려주는 기능 추가

10월 10 ~ 12일 까지 샌프란시스코에서 GitHub Universe라는 GitHub 행사가 진행중인데요. 프로젝트에서 사용중인 외부 라이브러리 정보들을 보여주는 기능이 추가됬습니다.

GitHub에 프로젝트의 의존성 정보를 보여주는 “Dependency graph” 기능을 추가했으며 이 페이지에는 프로젝트에서 사용중인 외부 라이브러리 정보를 표시합니다. 프로젝트 페이지의 “Insights” > “Dependency graph”에서 확인할 수 있습니다.

아래 스샷은 제가 당근마켓에서 만들어서 공개한 kakao_push라는 루비 라이브러리의 Dependency graph 입니다.

Github Dependency graph

사용중인 외부 라이브러리와 라이브러리 버전 정보가 적혀 있습니다. gemspec 정보를 읽어서 보여주고 있으며 일반 프로젝트의 경우에는 Gemfile, Gemfile.lock 에 적혀있는 정보를 보여줍니다.

현재는 Ruby, Javascript 프로젝트에 대해서만 지원중이고 조만간 Python도 지원할 예정이라고 하네요.

Dependents 탭을 클릭하면 이 라이브러리를 사용중인 다른 프로젝트를 알려줍니다. 위의 kakao_push 젬은 당근마켓에서만 사용하고 있어서 summernote 의 Dependents를 보여드리겠습니다.

Summernote dependent

인기 오픈소스답게 많은 프로젝트에서 사용중이네요 ^^~ 참고로 Private Repo에서 사용중인 내용은 나오지 않습니다.

여기까지는 사실 뭐 그냥 정보 보여주는거라 뭐가 더 있으려나 싶은데요. 진짜는 지금 부터입니다. 위의 정보를 바탕으로 조만간 오픈할 “Security alerts” 기능은 Dependency Graph에서 얻은정보를 토대로 외부 라이브러리중 보안이슈가 있는 라이브러리를 표시하고 버전 업그레이드해야할 내용을 알려줍니다. 아직 오픈은 안했고 조만간 오픈 예정이라고 합니다.

github security alert

외부 라이브러리들을 많이 사용하는것은 좋은데 보안 업데이트등을 제대로 하지 못해서 문제가 되는 경우가 있는데 GitHub의 Security alerts 기능이 이런 문제 해결에 도움이 될것 같아요.

앞으로는 Security alerts 을 넘어서 외부 라이브러리들의 업데이트 정보도 보여주면 좋겠네요 ~

이와 비슷한 기능을 하는 서비스들도 있는데요. Ruby의 경우에는 deppbot 이 있는데 외부 라이브러리가 새로 업데이트 되면 Pull Request로 알려주고 기존에 사용하던 CI에서 PR에 대한 테스트를 수행하게 하면 그 결과가 PR에 댓글로 달리게 되니 테스트 실패가 없다면 쉽게 머지 할 수 있겠죠. Node에는 Greenkeeper, CI 형태로는 gemnasiumdependencyci 가 있습니다.

참고정보

게시글의 아마존, iTunes 링크들을 통해 구매를 하시면 제휴(Affiliate) 프로그램에 의해 저에게 일정 금액이 적립될 수 있습니다. ^_____^

iOS 10.3 앱 아이콘 동적으로 변경하기

iOS 10.3에 예상치 못한 신규기능중 앱 아이콘을 변경하는 기능이 있습니다. 이번글에서는 이 신규기능을 활용하는 방법과 적용하지 못하는 경우를 적어볼려고 합니다.

MLB At Bat 앱에서 이 기능을 적용했는데요. 자신이 좋아하는 팀 로고로 앱 아이콘을 변경 할 수 있게 했습니다.

앱 아이콘 변경

MLB At Bat 앱 아이콘 변경

이 포스트의 내용은 영상으로도 촬영 했으니 영상도 참고하시면 동작하는 방식을 이해하기 더 쉬우실거에요

기능을 적용하는것은 정말 간단합니다. 우선 기존에 있던 프로젝트에 새로 추가할 앱 아이콘 이미지를 추가합니다. 예시의 경우 daangn_jeongja@2x.png, daangn_jeongja@3x.png 파일을 추가했습니다.

앱 아이콘 추가

앱 아이콘 추가

여기서 이미지를 Assets.xcassets 에 추가하면 안됩니다. 에셋에 추가해서 사용하고 싶어서 시도를 해봤는데 동작하지 않는것을 확인했습니다.

이미지를 추가 했으면 Info.plist 파일에 추가한 아이콘 이미지에 대한 정보를 등록합니다.

Info.plist 파일에 추가할 내용

Info.plist 파일에 추가할 내용

Xcode 의 Property Editor 에서 자동 완성되지 않는 항목들이라 위와 같은 구조로 일일이 입력해줘야 하는 번거로움이 있습니다.

“Icon files (iOS 5)” 키를 추가하고 그 밑에 “CFBundleAlternateIcons”를 “Dicionary” 타입으로 추가합니다. 그리고 나서 앞으로 변경 가능한 앱 아이콘 후보 이름을 적어 주는데요. 위의 경우 “bundang”, “jeongja” 라는 2개의 앱 아이콘 후보를 추가했습니다.

그리고 각각의 앱 아이콘 후보 이름 밑에는 “CFBundleIconFiles” 라는 “Array” 타입의 키를 추가하고 해당 항목 밑에 실제 앱 아이콘 후보의 이미지 파일명을 적으면 됩니다.

여기서 중요한건 실제 추가한 앱의 파일 이름과 소스코드에서 지정할 파일 이름이 달라도 된다는건데요. 위의 경우 실제 추가한 이미지 파일은 daangn_jeongja@2x.png 인데 이 파일에 해당하는 소스코드에서 참고할 이름은 “jeongja” 입니다.

Info.plist 에 추가한 항목의 XML 소스코드는 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
   <key>CFBundleIcons</key>
   <dict>
     <key>CFBundleAlternateIcons</key>
     <dict>
     <key>bundang</key>
     <dict>
       <key>CFBundleIconFiles</key>
         <array>
           <string>daangn_bundang</string>
           <string>daangn_bundang-72</string>
           <string>daangn_bundang-Small</string>
         </array>
       </dict>
     <key>jeongja</key>
     <dict>
       <key>CFBundleIconFiles</key>
       <array>
         <string>daangn_jeongja</string>
         <string>daangn_jeongja-72</string>
         <string>daangn_jeongja-Small</string>
       </array>
       </dict>
     </dict>
   </dict>
.... 생략

이제 소스코드에서 앱 아이콘을 변경하고자 하는 부분에 아래 코드를 입력합니다

UIApplication.shared.setAlternateIconName("jeongja") { (error) in
    debugPrint("error \(error)")
}

위 코드가 실행되면 앱 아이콘이 변경됩니다. 마지막에 실행되는 코드 블럭은 실행완료후에 호출되는데 error 가 nil 인 경우 성공한것이고 그렇지 않은 경우 변경에 실패한것입니다.

앱 아이콘 변경 확인

앱 아이콘 변경 확인

앱 아이콘 변경코드가 호출되면 위와 같이 사용자에게 알려주는 팝업이 실행되는데요. 이 팝업은 무조건 보여지는 거라 보이지 않도록 할 방법은 없습니다.

앱 아이콘 변경을 하다보면 안되는 경우를 몇가지 발견하게 되는데요.

첫째, 메인스레드에서 코드가 호출되지 않는 경우 앱 아이콘 변경이 되지 않습니다. 메인스레드가 아닌경우 complete 블럭에서 error에 다음과 같은 객체가 전송됩니다.

"Error Domain=NSCocoaErrorDomain Code=3072 \"작업이 취소되었습니다.\""

아이폰 시스템 언어가 영어일 경우 아래 메시지

"Error Domain=NSCocoaErrorDomain Code=3072 \"The operation was cancelled.\""

이때는 메인 스레드에서 실행되도록 다음과 같이 수정합니다.

DispatchQueue.main.async {
  UIApplication.shared.setAlternateIconName("jeongja") { (error) in
    debugPrint("error \(error)")
  }
}

둘째, 앱이 foreground 에서 실행중이지 않을때는 앱 아이콘을 변경할 수 없습니다. 이는 사용자 몰래 앱 아이콘이 변경되는것을 막기위한 조치라고 생각됩니다.

셋째, 에셋으로 이미지 추가가 안되다보니 아이패드를 지원하는 경우 예전에 아이콘 추가하던 방식대로 앱 아이콘 이미지 파일의 이름을 맞춰야합니다. 위의 예시에서 daangn_jeongja-72 라고 하는식으로 뒤에 suffix 를 예전에 하던대로 맞춰야하는거죠. 파일 이름 규칙은 애플문서(App Icons on iPhone, iPad and Apple Watch)를 참고 하세요.

참고자료

게시글의 아마존, iTunes 링크들을 통해 구매를 하시면 제휴(Affiliate) 프로그램에 의해 저에게 일정 금액이 적립될 수 있습니다. ^_____^

kibana 혹은 elasicsearch 에서 unique count 정확하게 보기

사용자 pv 확인을 위해 kibana를 사용중이었는데 kibana의 unique 갯수와 kibana와 동일한 쿼리로 추출하는 일일 접속자의 id 목록의 갯수와 맞지 않는 현상이 발생했다.

es에서 갯수를 계산할때 대략적인 수치를 사용한다는것을 알고는 있었지만 대략 5000 vs 4500 정도로 오류의 편차가 너무 커서 이를 해결하고자 방법을 찾던중 실마리를 찾았다.

unique 갯수를 추출하기 위해 cardinality aggregation을 사용하는데 이 수치에는 어느정도의 에러 수치가 있고 이를 해결하기위해서는 precision_threshold 옵션 수치를 수정하면 된다. precision_threshold 수치가 높으면 더 많은 메모리와 자원을 사용하고 속도는 느리지만 정확한 값을 얻을수 있고 낮으면 메모리와 자원도 적게 쓰고 속도도 빠르지만 부정확한 데이터를 얻게 된다.

precision_threshold 값의 기본값이 얼마인지는 모르겠지만 내가 문제 생겼던 서비스의 경우 수치가 10,000 이하이기 때문에 precision_threshold 값을 10,000으로 설정했더니 정확한 데이터를 얻을수 있었다.

kibana에서 precision_threshold 값을 입력하기 위해서는 Y-Axis > Advanced > JSON Input 에 다음과 같이 입력한다.

{"precision_threshold": 10000}

precision_threshold 입력하기

그런데 이값을 적용하고 나면 정말 느려진다 =_= 정확한 수치가 중요한 경우가 아니라면 굳이 입력하지 않고 흐름을 보는데만 확인하고 필요할때만 입력하는게 좋을것 같다.

참고자료

게시글의 아마존, iTunes 링크들을 통해 구매를 하시면 제휴(Affiliate) 프로그램에 의해 저에게 일정 금액이 적립될 수 있습니다. ^_____^