Mac OSX 에는 Xcode 라는 좋은 무료 개발도구가 있다. 물론 Mac 에서도 CodeLite, CodeBlocks 와 같은 잘 알려진 오픈소스 개발도구를 쓸 수 있지만, Codeblocks 는 Mac OSX 에서의 안정성이 떨어지는 감이 있고 CodeLite 는 Mac 에서 command-line 프로그램 개발 시 iostream 의 cin 을 제대로 처리 못하는 등 조금씩 문제를 안고 있기 때문에 쓰다 보면 불편함이 쌓이게 되고, 그러다 보니 Apple 에서 Mac 을 가장 잘 지원해 주(는 것으로 믿고 싶은...)는 Xcode 같은 Native app으로 다시 돌아가곤 한다.


이번 글에서는 Xcode 로 C++, Objective-C, Swift 와 같은 언어를 사용한 개발에 있어서, 협업 개발을 위한 git 저장소와 Xcode 가 자체적으로 제공하는 git client 기능을 사용하는 방법을 기록해 두려 한다.


개발자의 결벽증

물론 Remote 저장소에서 repository를 cloning 하거나 Local 저장소에서 작업하다가 그때 그때 push 하면서 "미친 년 널 뛰듯이" 아무렇게나 되는대로 작업할 수는 있다. 그러나 사람마다 기준이나 스타일은 다르겠지만, 하드디스크의 작업 영역에 온갖 너저분한 임시 checkout 디렉토리, 수정하다 만듯한 폴더와 파일 조각들이 여기저기 널려 있는 꼴은, 마치 소스의 indent 가 들쭉날쭉한 참상을 보는 것 만큼이나 속상하는 일이기 때문에 다음과 같은 원칙을 정해 둔다


  • 하나의 프로젝트에 대해 주로 작업하는 Local 저장소와 Remote 저장소의 대응은 1:1 일 것
  • 사용하는 Tool 이 Sublime Text 또는 Sourcetree 이건 Xcode 이건 간에 프로그램 소스가 저장되는 repository는 하나만 존재할 것
  • 프로그램 소스코드와 데이터파일을 제외한 프로젝트파일, 바이너리 실행 또는 오브젝트 파일들은 git 을 통한 버전관리에서 제외 될 것


필요한 것들(또는 지금 쓰고 있는 것들)

  • Remote 저장소(Github, Gitlab 계정 또는 본인만의 git server) - 필자는 Remote git 저장소를 위한 AWS 가상머신(doubleshot.io)
  • Git Client - OSX 에 내장된 자체 git & Sourcetree app



정리해 두려는 것들

  • 이미 존재하는 Remote 저장소를 내려 받고 Xcode 에서 작업하거나 또는,
  • 새로운 Local 저장소를 만들어 Xcode 에서 작업하고, Remote 저장소와 연동, 업로드(보관)



1. Remote 저장소를 내려 받고 Xcode 에서 작업하기


1.1 저장소 이름은 gittest2, Remote 저장소의 주소는 ssh://gituser@doubleshot.io/home/gituser/repos/gittest2 라 하자. 


1.2 가장 먼저, Sourcetree 에서 Remote 저장소를 cloning 해서 Local 로 다운로드 한다. 다음으로 Xcode 에서 작업할 새로운 프로젝트를 생성해 두고, Sourcetree 창을 나란히 배치한다.


해당 repository 에서 R-click, "Show in Finder" click


Finder 에서 저장소 폴더를 선택, Xcode 의 프로젝트 내부로 drag 한다(또는 Finder를 거치지 않고 Sourcetree 에서 Xcode 로 직접 drag 해도 된다)


Xcode 는 외부 폴더를 가져올 때의 옵션을 묻는다. 그림과 같이 설정하고 Finish!(Create Group을 하면 Xcode 내에 그룹이 만들어지고 그 내부에 git 폴더가 논리적으로 참조되고, Create Folder Reference 를 하면 프로젝트 내에 그룹이 만들어지지 않고 git 폴더 자체가 직접 참조된다)


Xcode 프로젝트 안으로 외부 git 저장소가 안전하게 import 되어 있다. 오른쪽 정보창에서 저장된 path 를 확인해 보자. Xcode 가 기본으로 자동 생성해 주는 main.cpp 는 휴지통으로...!



1.3 위의 과정을 거치면 Xcode 내에서 add, commit, push 등 모든 git 기능을 사용할 수 있다. Xcode 프로젝트 내에 Working copy 가 복사되어 만들어지는 것이 아니라, Sourcetree 가 Clone 해 둔 repository를 그대로 사용하는 것이다.



2. Local 저장소로 Xcode 에서 작업하고 Remote 저장소와 연동하기


2.1 Git server 에서 Remote 저장소를 생성해 둔다(이 과정은 아래 2.7 이후에 해도 된다). 저장소 이름은 xcodegit_repo, Remote 저장소의 주소는 ssh://gituser@doubleshot.io/home/gituser/repos/xcodegit_repo 라 하자. 


2.2 Sourcetree 에서 "Create a local repo..." 선택, Local 저장소를 생성한다(이 때, "Also create remote..." Check는 반드시 해제).



2.3 Xcode 에서 작업할 새로운 프로젝트를 생성한다.



Xcode 에서 프로젝트 생성 후, 자동 생성되는 main.cpp 는 휴지통으로... 만약 사용할 필요가 없다면 main.cpp 파일이 속한 그룹 전체를 삭제해도 무방함



2.5 Sourcetree 에서 Local 저장소를 R-click, "Show in finder" 선택. Finder 에서 Xcode 프로젝트 내부로 폴더 drag

Xcode 의 프로젝트 내부로 drag(Sourcetree 에서 직접 drag 해도 된다)


1.2와 마찬가지로 가져오기 옵션 설정



2.6 Xcode 로 가져온 Local 저장소 폴더 R-click, "New file" 을 선택(저장되는 path 확인), 작업할 소스 파일(cpp 등) 생성.



2.7 Xcode 에서 소스 파일을 편집, 저장 후 git add, commit 등 실행(로컬 저장소에 저장)


2.8 작업이 완료된 소스 파일을 Remote 저장소와 연동 저장하기 위해서는 소스 파일이 저장된 폴더 선택, Xcode 메뉴의 "Source Control" 선택, Remote 저장소 정보를 설정한다.


Add Remote 선택


Git server 에서 생성해 둔 Remote 저장소의 주소를 등록


코딩 및 테스트 작업이 끝나면 Xcode 메뉴에서 "Source Control" -> Push 를 통해 Remote 저장소에 업로드할 수 있다


<참고> Git server 와의 연결을 ssh 프로토콜을 통할 경우에는, Xcode 가 생성해 주는 ssh 인증키를 git server 측과 '키교환'을 해 두어야 한다  


- Barracuda -


저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들


소장하고 싶은 영화나 동영상 파일들을 모아서 디스크 한 켠에 폴더별로 잘 정리해서 보관하는 경우가 많다. 그렇다고 자주 들춰보기는 쉽지 않지만, 일종의 "혹시나 다음에 또 보고 싶어질지도 몰라...ㅋ" 하는 미련 같은 건 아닐까(그러다 결국 한 순간에 폴더째 지워버리게 되기도 하지만...ㅠㅠ). 아, 위에 나오는 짤방성 이미지의 context sensitive한 자막은 참 공감이 많이 가고, 무엇보다 푸근한 처자에게 고맙다(뭐가 ? ^^;;).


2016년 첫 포스팅 치고는 거의 솔플메모에 가까울 정도로 가볍다. 언제나 심각하고 거창할 순 없는 거다. 각설하고, 이제 본론인 메모 작성으로 넘어가자.


Handbrake로 동영상을 변환

다운로드 받은 영화를 보관 또는 거실TV에서 상영하기 전에 거실 PC의 Linux(Ubuntu 14.04 LTS)에서 무료 동영상변환기인 핸드브레이크(Handrake)로 인코딩 하게 된다(Mac book에도 Adapter라는 쓸만한 인코딩 앱이 있긴 하지만, 귀여운 내 맥프레에게 이런 격 떨어지는 일을 시키고 싶지는 않다).


그런데, TV(스마트 TV가 나오기 전 모델의 42인치 LG LED)의 미디어플레이어가 개후져서 조금 옛날 것이라 AC3 오디오를 인식 못하거나 새로운 코덱으로 인코딩 된 mp4 파일은 아예 화면도 띄우지 못하는 경우가 많다. 이 때 만날 수 있는 여러 문제 상황을 단순하게 넘기려면, 아예 Handbrake에서 동영상 변환을 할 때 영상의 화면에 자막을 심어 버리는 작업을 하는 쪽이 속 편하다.


한글 자막 .smi 파일은 대부분 EUC-KR 코드

인터넷에서 입수되는 대부분의 한글 자막은 smi 포맷으로 되어 있고, 한글코드는 EUC-KR 인 경우가 많다(불평은 하지 않습니다. 자막 제작자님들 고맙습니다 ^^). 그런데 문제는 Handbrake가 srt 포맷의 자막만 지원하기 때문에 2번의 변환을 거쳐야 한다. 한 번은 한글 코드 변환, 또 한 번은 자막파일 변환. 이과정이 귀찮아서 Bash shell 을 작성해 보았다. 사용 방법과 소스는 아래 참고.


자막 변환 스크립트 사용법

우선 smi -> srt 자막을 변환하는 Linux 용 프로그램 subs를 설치해야 한다(작성자 <Dmitry Karasik, dmitry@karasik.eu.org> 에게 감사). 좀 오래 된 거지만 지금도 쌩쌩 잘 돌아간다.  그 다음에 사용할 iconv 는 대다수 Linux 배포본에 포함된 코드 변환 도구이므로, 따로 설명은 생략한다.


다음과 같이 subs 를 우선 설치.

$ sudo apt-get install libsubtitles-perl

$ subs -> 테스트 삼아 한 번 실행해 보자

subs: convert, join, split, and re-time subtitles


format:

   subs [options] subfile [ subfile ... ]


options:

   -a coeff, - a and b coefficients in linear transformation

   -b time     u=at+b, where t and u are src and dest times

...


사용법은 간단하다. 스크립트(conv_eucsmi2utfsrt.sh ... 파일 명은 알아서 변경)를 Linux 계정의 $HOME/bin  정도에 복사해 두고(chmod +x 가 필요할지도...), 변환할 자막 파일이 있는 경로로 가서 "conv_eucsmi2utfsrt.sh 자막파일.smi" 같은 식으로 실행해 주면 된다. 변환에 성공했을 경우 다음과 같이 나오게 될 것이다.


명령어 인자로 전달하는 자막파일명 부분에 와일드카드를 쓴다든지, 여러개 파일의 일괄변환 등에 대해서는 따로 고려하지 않았다. 모든 smi 파일을 단숨에 변환할 일이 그다지 많지 않기 때문인데, 나중에 필요하면 한 번 생각해 보기로...


$ conv_eucsmi2utfsrt.sh tmp.smi

Converted tmp.smi(euc-kr) to tmp.srt(utf8)

Enjoy it! ;)


특별한 기술이 필요하거나 대단히 복잡한 것은 없다. 잘 보면 아래 부분 실행문들에서 iconv, subs, sed 를 적당한 옵션을 주어 각각 실행하는 것이 전부다. 그러나 귀찮은 작업을 스크립트 하나 실행해서 해 낼 수 있다는 점에서 자화자찬 중.


conv_eucsmi2utfsrt.sh (Bash shell script 소스)

#!/usr/bin/env bash
# Bryan(Barracuda), 2016.1.
# Usage: conv_eucsmi2utfsrt.sh filename.smi(with EUC-KR Kor. char.)
#
# *.smi 파일(euc-kr)을 iconv와 subs 를 써서 *.srt(utf8) 형식으로 변환
# 변환 후 srt 파일 내에 smi 파일에서 자주 보이는 흔적인   가 있으면 삭제함
# 자막 변환 도구 subs는 sudo apt-get install libsubtitles-perl 로 설치되어 있어야 함(ubuntu 기준)

args=1
param=$1

if [ "$#" -ne "$args" ]; then
    # $0 의 Path 부분 삭제: ${0##/*/}
    echo -e "\033[0;33m$# arguments ... use \"${0##/*/} filename.smi\"\033[0m"
    exit 1
fi

# 인자로 전달 된 파일명에서 확장자 부분을 제외한 앞 부분을 잘라냄(뒤에서부터 .로 시작하는 부분을 삭제)
# param이 . 으로 끝나면 basename은 "filename", extension은 ""
# param에 . 이 없으면 basename은 "filename", extension도 "filename", index는 "0"
basename=${param%*.*}
extension=${param##*.}
index=`expr index $param .`

# 파일명이 . 으로 끝나는 경우, 파일명에 . 이 없는 경우, 확장자가 smi 가 아닌 경우 오류
if [[ "$extension" = "" || "$index" = "0" || "$extension" != "smi" ]]; then
    echo -e "\033[0;33mBad file extension ... I want \"*.smi\" file.\033[0m"
    exit 1
else if [ ! -f $param ]; then
        echo -e "\033[0;33mFile $param missing.\033[0m"
        exit 1
    fi
fi

if [ -e "$basename.srt" ]; then
    echo -e "\033[0;33mFile $basename.srt already exists. Plz delete or rename it.\033[0m"
    exit 1
fi

# 한글 euc-kr 코드를 utf8 코드로 변환
iconv -f euc-kr -t utf8 $basename.smi > _$basename.smi
# smi 파일을 srt 파일로 변환
subs -c srt _$basename.smi -o _$basename.srt
# srt 파일 내의   를 제거
sed "s/ //g" _$basename.srt > $basename.srt
# 중간 작업파일 제거
rm -f _$basename.smi _$basename.srt

echo -e "\033[0;32mConverted $basename.smi(euc-kr) to $basename.srt(utf8)"
echo -e "\033[0;32mEnjoy it! ;)\033[0m"


<*주의*> 위 소스의 44~45 라인을 아래 내용으로 수정 바랍니다. syntaxhighlighter 로 bash 소스를 표시할 경우 html 요소(&nbsp;) 가 정상적으로 출력되지 못하는 군요. 이 점 양해 바랍니다.

# srt 파일 내의 &nbsp; 를 제거

sed "s/&nbsp;//g" _$basename.srt > $basename.srt



Mac 사용자라면 간단히 MinySubtitleConverter 를 써 보자


만약 Linux 가 아닌 Windows 나 Mac 사용자라면 http://blog.myhyuny.com 블로그를 방문하여 MinySubtitleConverter 를 다운로드 받아서 사용하면 위의 과정을 간편하게 한 번에 끝낼 수 있다. 직접 테스트 해보니 한글코드와 srt 변환이 아주 훌륭하게 작동한다.


2014년 3월이 마지막 업데이트이긴 하지만 OSX 10.11(El Capitan) 에서도 문제 없이 사용할 수 있는 것으로 확인되었다.




Input Encoding 을 따로 지정하지 않고 Auto 로 두어도 한글 코드를 자동으로 인식한다. File 메뉴에서 Open -> smi 파일을 선택하면 smi 파일이 있는 폴더에 srt 파일이 자동 생성된다.



- Barracuda -


저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들