Tibero DB 를 사용할 일이 있었는데, tbAdmin이 구려서 직접 연결해서 데이터를 가져와야할 일이 있었다.

심지어 마땅한 다른 언어를 사용할 수 없어서 Excel VBA로......


윈도우 기준으로 ODBC를 시스템에 등록하고, 해당 드라이브를 이용해서 연결하면 된다.


1. ODBC 등록

ODBC 설치법은 인터넷에 검색하면 많이 나오지만, 인스톨러를 사용해서 등록하라고 하는데,,, 왠지 마음에 안들어서 수동등록함.

우선 필요한 ODBC 파일은.. 검색하면 어디서 구할 수 있는지 잘 나온다. (tbAdmin 에는 없다., 서버를 소스코드(tar.gz)로 받았을 경우 client/win32/lib/libtbcli.dll, libtbcli.lib 에 있음)

.lib도 필요한지 아닌지 잘 모르겠지만 일단 이름이 같으니까 같이 챙겨서, 삭제되지 않을 적당한 곳에 잘 꽁쳐놓자.


이후 cmd를 관리자모드로 열어서 아래 명령어 입력. 드라이버 이름(Tibero 6)이나 경로는 필요에 따라 수정해주면 된다.

odbcconf /A {INSTALLDRIVER "Tibero6|driver=D:\odbc\libtbcli.dll"}
64bit 시스템이라면, 32bit 로 등록해야 한다.
%windir%\syswow64\odbcconf /A {INSTALLDRIVER "Tibero6|driver=D:\odbc\libtbcli.dll"}


2. Excel VBA 에서 연결

도구 - 참조 에서 Microsoft ActiveX Data Objects 6.0 Library 체크 후 확인한 후 아래 코드 참고해서 작성.

Driver={Tibero 6} 는 위에서 ODBC 등록시 사용한 드라이버 이름을 사용하면 된다.


Dim conn As New ADODB.Connection
conn.Open "Driver={Tibero6};Server=x.x.x.x;Port=xxxx;UID=user;Database=sid;Password=pwd;"

Dim rs as New ADODB.Recordset
rs.ActiveConnection = conn
rs.Open "SELECT * FROM table;"

Do Until (rs.EOF = True)
...
    rs.MoveNext
Loop

rs.Close


대충 이런식으로 사용.

이 후로는 다른 DB 사용할 때랑 비슷하다. 연결 문자열 정도만 참고하면 될 듯?

보통 요즘 나오는 탈옥툴에 사용될텐데...
ipa 의 코드사인을 다시 하는 방법.

iOS App Signer 라는 앱이 있는데.. 왜인지 이걸로 하면 안된다. https://dantheman827.github.io/ios-app-signer/

--------------------

 

난 보통 소스코드를 받아서 xcode 를 이용하는 방법으로 했는데, 이번에 그게 좀 여의치 않아서 찾아봄.
예전 방법이 많이 올라와있는데 그것들은 안되더라.

 

개발자 인증서는 키체인에 들어있는걸 가정하고, Profile 은 애플 개발자 홈페이지에서 다운받으면 됨.
와일드카드를 쓰더라도 앱 아이디가 중복되면 안된다는 것 같은데,, 문제가 생기면 Info.plist 에서 앱 아이디도 바꿔주자

 

# entitlements 정보 추출
security cms -D -i path/to/MyProfile.mobileprovision > provision.plist
/usr/libexec/PlistBuddy -x -c 'Print :Entitlements' provision.plist > entitlements.plist

# 압축풀고 기존 사이닝 제거
unzip MyApp.ipa
rm -rf Payload/MyApp.app/_CodeSignature

# 프로파일 넣어주기 및 사이닝
cp path/to/MyProfile.mobileprovision Payload/MyApp.app/embedded.mobileprovision
codesign -f -s "iPhone Developer: Some Body (XXXXXXXXXX)" --entitlements entitlements.plist Payload/MyApp.app

# 프레임워크가 있다면 그것들도 다시 사이닝
codesign -f -s "iPhone Developer: Some Body (XXXXXXXXXX)" --entitlements entitlements.plist Payload/MyApp.app/Frameworks/*

# 패키징
zip -qr app-resigned.ipa Payload

대충 이런 과정을 거치면 된다.

 

이 후 앱스토어에서 Apple Configurator 2 라는 앱을 받아서, USB 연결된 장비에 생성된 ipa 를 던져주면 설치됨.

 

설치 이후에 아이콘이 어둡고 실행이 안된다면 사이닝이 잘못되었거나 profile 에 해당 기기가 포함이 안된 경우.

 

참고
https://stackoverflow.com/a/37172815

TLS 1.0 은 이제 보안 정책으로 사용이 금지되어 있다.

그래서 기술적으로는 구현이 되어있음에도 불구하고, 브라우저나 각종 라이브러리로 사용을 하려고 하면 오류가 난다.



크롬 기준 이러한 사이트에 접속하려고 하면


The connection to this site uses 

TLS 1.0 (an obsolete protocol), 

RSA (an obsolete key exchange),

3DES_EDE_CBC with HMAC-SHA1 (an obsolete cipher).


이런 메시지를 내면서 접속을 불허한다.




이런 사이트에 대해 Python 을 사용하여 요청을 보낼때 이를 굳이 우회하는 방법.


나의 경우 requests 라이브러리를 사용했는데, urllib3 라이브러리를 사용한다면 동일하다.

urllib3.util.ssl_.DEFAULT_CIPHERS 에 'DES-CBC3-SHA' 을 추가해주면 됨.

콜론으로 구분되기 때문에



urllib3.util.ssl_.DEFAULT_CIPHERS += ':DES-CBC3-SHA'


이렇게 작성해주면 된다.

(DES-CBC3-SHA 과 3DES_EDE_CBC 은 명명법만 다르지 같다고 한다.)


requests 라이브러리를 쓴다면

requests.packages.urllib3 로 임포트 되어 있으니 여기다 해줘도 됨(혹은 여기다가 해줘야만 할 수도?)



requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS += ':DES-CBC3-SHA'


이래도 안되는 경우가 있는데, OpenSSL 문제인 것 같다.

안되는 시스템에서 

$ curl --sslv3 주소

을 해봤을 때,

curl: (4) OpenSSL was built without SSLv3 support

같은 오류가 나온다면 v3을 지원하는 버전으로 재컴파일 하거나 설치해주도록 하자.


Trivial

requests 기준으로 인증서 오류도 날테니 요청을 보낼때 verify=False 인자도 추가해주자.



그리고 이러면 또 warning 이 매번 출력되는데, 아래와 같은 방법으로 비활성화 할 수 있다.

똑같은 코드지만, 상황에 맞게 복붙해서 사용하자.


# urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

# requests
requests.packages.urllib3.disable_warnings(requests.packages.urllib3.exceptions.InsecureRequestWarning)


참고

https://stackoverflow.com/questions/50707974/force-tls-1-0-connection-with-requests?noredirect=1&lq=1

https://stackoverflow.com/questions/27981545/suppress-insecurerequestwarning-unverified-https-request-is-being-made-in-pytho

망할 MS는 unicode 를 기본지원하지는 못할망정 호환지원도 제대로 못한다.

 

utf-8 csv의 경우에, Excel 로 바로 열면 한글이 모두 깨져버리는데,

데이터 불러오기 등의 번거로운 방법을 통해 불러오더라도 깨지는 X같은 경우가 발생한다.

 

나도 웬만하면 cp949로 인코딩을 굳이 해줄텐데,, 웹에서 javascript 로 데이터를 생성하고 바로 내려받는지라,

어떻게 방법이 없이 MS에 대한 저주만 한가득 하고 있었는데....

 

-------------------------------------------

 

UTF-8 BOM 을 통해 (반틈만) 해결하였다.

 

방법은, 파일의 가장 앞에 \xef\xbb\xbf 혹은 \ufeff 을 넣어주면 된다.

이제 Excel 에서 바로 열어도 한글이 깨지지 않는다.

 

나의 경우엔

'data:application/csv;charset=utf-8,'+encodeURIComponent(csv)

'data:application/csv;charset=utf-8,\ufeff'+encodeURIComponent(csv)

이렇게 바꿔주었다.

 

다만, Excel 이 아닌 다른 프로그램으로 열거나 직접 csv파일을 읽어와서 작동시킬때 문제가 생길 수도 있는데....

이건 MS 를 욕하자.

 

-------------------------------------------

Python의 경우 파일을 쓸 때 인코딩을 utf-8-sig 로 지정하면 된다

open(filepath, 'w', encoding='utf-8-sig')

-------------------------------------------

 

MS 는 IE(+Edge)와 CP949(euc-kr)를 하루빨리 없애버렸으면 좋겠다.

 

 

참고

 

UTF-8 인코딩에서의 BOM(Byte Order Mark) 문제 :: wystan's tales

 

https://stackoverflow.com/questions/17879198/adding-utf-8-bom-to-string-blob

결론부터 말하자면 그냥 우분투에 3.6을 깔자..

다만 그 과정은 다른 상황에서 적용할 수 있을테니 남겨둠.


----------


Ubuntu 서버들은 파이썬 버전이 3.4(14.04) 혹은 3.5(16.04) 이고, 3.6 을 설치하긴 귀찮았다.

마침 맥의 파이썬이 3.6이길래 zappa 설치를 시도했는데, 의존성 설치에서 fail. 언제나 그렇듯 인코딩 문제...


의존성에 있는 kappa 라이브러리의 패키지 정보에 넣기 위한 README 파일을 제대로 읽어오지 못하는 거였고,

tree 구조를 표현하는 문자가 문제였음.


builtins.open 함수에서 encoding 을 지정해주지 않으면 기본값은 locale.getpreferredencoding(False) 을 사용하고,

이 문자열이 우분투에서는 UTF-8 이였지만, 맥에서는 US-ASCII 였다.


기본값을 어떻게 바꿔줘야하나 찾아보다가, 잘 안나오고 귀찮아서 소스코드를 받아 설치하는 방법으로 진행했다.


$ git clone https://github.com/garnaat/kappa

$ cd kappa


zappa 는 kappa (=0.6.0) 을 의존성으로 가지니

$ git checkout 0.6.0


$ vi setup.py

14     return open(os.path.join(os.path.dirname(__file__), fname), encoding='utf-8')


$ sudo pip3 install -e .


이렇게 한 후에 다시 zappa 설치를 진행하면 끗!


다만, 이후에도 비슷한 문제가 생기고 어차피 zappa 는 virtualenv 환경을 필요로한다.

그냥 우분투에 가상환경으로 3.6을 만들어두고 하자...

매번 검색하기 귀찮아서 작성함

그냥 UNetbootin 을 사용하는것도 괜찮은 선택지인 것 같다.


디스크 목록 보기

$ diskutil list


디스크 추출

$ diskutil unmountDisk /dev/disk#


ISO -> IMG

$ hdiutil convert -format UDRW -o ~/path/to/output.img /path/to/input.iso

$ mv /path/to/output.img.dmg /path/to/output.img


Flashing image

$ sudo dd if=/path/to/output.img of=/dev/rdisk# bs=8m


압축된 이미지 Flashing

$ gunzip -c /path/to/image.gz | sudo dd of=/dev/rdisk# bs=8m



bs 는 한번에 작업할 block size. 1m 을 쓰라고 하는 곳도 있는데.. 뭐 상관없겠지


dd 작업 중간에 Ctrl+T 를 누르면 작업상황을 확인할 수 있다.

난 직접 서버에서 최신버전을 갱신하는 식으로 해야할 줄 알았는데...

apple 에서 json 으로 결과를 뱉어주는게 있다.. 씐기..


잊어먹을까봐 적어둠.


http://itunes.apple.com/lookup?bundleId=[bundleIdentification]


으로 쿼리를 보내면 스크린샷 이미지, 장르, 버전 등의 앱정보를 JSON 으로 반환해준다.

이를 읽으면 됨.


아래 출처에 코드도 있음.



출처:

http://stackoverflow.com/questions/6256748/check-if-my-app-has-a-new-version-on-appstore

Apple 개발자 페이지에서 App ID 등록 및 Push 인증서 발급까지 끝낸 이 후.


0. 개발용 인증서 등록

잘 까먹는 과정 중 하나라서..

Push 서비스를 이용하려면 개발용 인증서 새로 발급해야 한다. 와일드카드 ㄴㄴ

발급 후 다운받을 수 있는 .mobileprovision 파일을 실행 후

프로젝트 Build Settings -> Code Signing Identity 에서 해당 인증서 선택


==========


1. .cer 파일을 실행해서 키체인에 등록

2. 키체인 - 인증서 카테고리 에서 인증서 찾아서 (앱아이디로 검색)


3. 왼쪽 접힌걸 열어서 인증서와 개인키를 같이 선택, 우클릭 -> 2개 항목 보내기

ㄴ 정확한건 아니지만, sandbox 용은 개인키와 함께, production 용은 인증서만 선택해서 추출해야 작동을 하는 것 같다.

원래 잘 되던게 언제부턴가 이러던데, 정확한 원인이나 이유는 잘 모르겠음.


4. .p12 포맷으로 적당한 곳에 저장. 비밀번호는 설정안해도 된다.

5. $ openssl pkcs12 -in cert.p12 -out cert.pem -nodes

6. 위에서 비밀번호를 지정했다면 해당 비밀번호를, 아니라면 그냥 엔터

7. 완성

SMS API 를 연동하면서, 보낼 문자의 길이를 EUC-KR 인코딩에 맞게 카운트할 필요가 있었다.


단순히 EUC-KR 로 인코딩해서 카운트len(string.encode('euc-kr'))해도 되긴 하지만, "뷁" 같이 EUC-KR 테이블에 없는 문자는 ? 로 치환 후 계산이 필요했음.


즉, 내가 원하는건

1. EUC-KR 에 없는 문자는 ?로 치환하고

2. EUC-KR 인코딩에 맞게 글자수 카운트

를 Python 2.7 에서!


PHP 코드 및 원리는 http://dev.epiloum.net/293 여기에 나와있으며, CP949 / EUC-KR 차이 등에 대해 상세히 잘 설명되어 있다.



길이 자체는 위에 말한듯이 euc-kr 로 인코딩 후 카운트하면 되니 상관없고, 지원하지 않는 문자열을 ?로 만드는 과정이 필요.

utf-8 로 인코딩된 문자열이 입력으로 들어오는 기준으로 작성되었다.


대충 만든거니 대충보고 쓰자...


FUNC: convert_euc_kr

INPUT: content (utf-8)




기반 코드들을 Python 3 으로 마이그레이션함에 따라, 이 코드도 수정이 필요하였다.

에러가 나지 않게 타입(str, byte)부분만 바꿔줘서 제대로 작동이 되는지는 확인해보지 않았다.




리턴값은 여전히 utf-8 로 인코딩 되어 있으니, 길이를 구할때는 len(ncontent.encode('euc-kr')) 로 하면 됨.


끝.

맥에선 brew 로 잘 깔았던 것 같은데..

우분투에선 apt 로 받으니 버전이 낮다.


여튼 맥이고 우분투고 환경변수 설정 문제도 있으니 써둠.



Mac 일 경우

$ brew install go



Ubuntu 일 경우

1. https://golang.org/dl/ 에서 해당하는 파일을 다운로드

2. $ sudo tar -C /usr/local -xzf go*******.tar.gz

3. 환경변수 추가(/etc/.profile 혹은 ~/.profile)

export GOROOT=/usr/local/go

export PATH=$PATH:$GOROOT/bin


일단 이렇게까지 하면 설치 및 사용은 잘 된다.


GOPATH 설정

그런데 go get 등을 하려면 GOPATH 를 설정하라고 하면서 안됨.

찾아보니 그냥 다운받는 패키지를 저장하는 장소를 지정해달라는 것. 설치 디렉토리는 여러 이유로 안됨.(권한, 업데이트 등등)

나는 그냥 ~/golang/pkg 로 지정하였다.

export GOPATH=~/golang/pkg


이러면 go get 등도 잘 됨


go install 을 할 경우 $GOPATH/bin 에 생긴다.




참고:

http://munchpress.com/install-golang-1-5-on-ubuntu/

+ Recent posts