늘모자란, 개발

늘모자란, 개발


docker에 mysql을 올려서 사용하고 있는데, 어느 순간 갑자기 어디서도 안붙어진다. 
localhost를 바라보고 있는 서비스 소스 측에선 사용이 되는데 도저히 외부에선 붙어지지가 않았다.

별도의 테스트 디비가 없기때문에 접속이 안되서 로컬호스트로 처리도 못하는 상황. 
mysql로 붙는 속도가 현저히 느려져서 skip-name-resolve 옵션을 켜기도 했는데..

권한이고 iptables고 ufw 고 확인안해본게 없는데 지푸라기라도 잡는 심정으로 docker를 재시작했더니 그냥된다.
그냥 docker-proxy가 얌전히 맛이가서 dns조회쪽에 문제가 됐던게 아닌가한다. 저 옵션은 사실 켜야될 필요가 없는데...
간만에 황당한거 겪어서 기록으로 남긴다.
2018/04/23 02:42 2018/04/23 02:42
제목을 지을땐 항상 희한한 기분이다.
문법이 맞나 싶어가지고.. 어쨌든 백업할때 느꼈던건데, 나는 docker를 그냥 디스크만 옮기면될줄알고 다른디스크에 똑같은 경로로 옮겼다.
그리고 docker_opt를 다시 잡아준 후에 docker start 를 통해 컨테이너를 실행하려니 정말 죽어도 안되는것이다.
별수를 다 써봤는데도 안되었다.

정말 이상한 일이라 검색해봤는데 나같은 사례가 없었다.
하긴 누가 디스크 to 디스크로 옮기는일을 할까.. 여튼 해답은 다음과 같다.

/docker/containerd/daemon/


해당경로에는 현재 돌아가고 있는 컨테이너의 정보들이 존재한다.
여기를 깔끔하게 지워주면 돌아가게 되는데 문제는 바로 여기

io.containerd.metadata.v1.bolt/meta.db


이 파일이다. 이 db파일내에 컨테이너 이름이 들어가있으면 docker는 해당 컨테이너가 이미 running 중이라고 판단한다.
즉, docker를 정상적으로 exit 한 상황이 아닌 상태에서 그냥 파일을 옮기면 meta.db엔 running 중인 상태로 기록되어 있기때문에 절대 돌릴 수가 없다.

해결법은 그냥 docker를 다시 깔고, 깔끔한 meta.db를 덮어쓰면된다. (데몬내에 다른 폴더들은 그냥 정리)
2018/03/15 15:51 2018/03/15 15:51
docker... 이 애증의 물건..

써본 사람은 알겠지만, docker와 스토리지 용량은 뗄 수 없는 관계이다.
항상 용량 문제에 항상 부딪히게 되는데 이건 소프트적으로 해결할 수 있는 용량이 아니다. 결국 물리적인 하드를 추가할 수 밖에 없었다...

이걸 왜 하게 됐냐면 이 글 의 내용 때문이다.
마지막으로, 서버 이미지를 하루마다 저장해 허브에 푸시합니다. DB 두개가 한번에 박살나도, 최대 10분내에 복구가 가능합니다.(순수하게 다운로드 시간)
라고 적어놨는데 허브에 푸시한다는건 말이 안된다. 일단 푸시 시간이 너무 어마무시하게 걸린다.
지금 내 이미지의 용량은 115기가쯤인데 48시간동안 docker push 했으나 결국 업로드에 실패했다... 컴퓨터가 먼저 리셋되었다.
결국 새 스토리지도 달았겠다 로컬에 저장해놓고 관리하기로 했다.

우선 현재 나는 2개 컨테이너를 운영중인데, MySQL 을 repl 화 해서 master / slave 로 나누어 관리하고 있다.
master와 slave의 차이는 my.cnf 와 같은 설정차이일뿐, 실 서비스 중인 master 컨테이너를 건드릴 필요는 없다.
그래서 slave를 commit 해서 새로운 이미지를 만들면된다. commit 중엔 컨테이너가 pause 상태에 빠지게 되는데, resume 되면 알아서 slave가 master로부터 데이터를 긁어와 동기화 되므로 별 걱정할 필요가 없다.

내 스토리지가 보관할 수 있는 이미지 갯수는 약 4개.
커밋 전 용량이 부족할 수 있으니 오래된 이미지를 정리한다. 이때 필터옵션을 줘서 오래된 이미지를 삭제 할 수 있다.

docker image prune -a -f --filter "until=3h"


이때, 필터옵션을 주지 않으면 사용하지 않는 모든 컨테이너가 삭제되므로 반드시 주의해야한다.
배치 작업을 위해 -f를 준거지 단순 정리목적이라면 -f를 사용하지 말고 !!반드시!! 재 확인이 필요함

그 이후, 컨테이너를 커밋한다.

docker container commit <CONTAINER> <IMAGE NAME:TAG>


인데 일반적으로 알고 있는 docker commit은 이미지에 commit 하는거고, 이건 container 를 기반으로 새로운 이미지를 만드는 것이다.
나같은 경우엔 TAG에 배치 시작 시간을 넣어줬는데, 태그는 아무래도 상관없다. creation date 로 prune 되기때문에 뭘 넣어도 상관없다.

이 과정에서 알게 된게 있는데,
같은 이름의 이미지명과 태그를 입력해 commit 하게 되면 commit 이 안되는게 아니고, 이름과 태그 둘다 none 으로 입력된다.

이렇게 해서 특정 시간마다 배치작업을 설정하게 되면, 3시간이 지난 이미지는 알아서 날아가고, 시간마다 새로운 이미지가 생성된다.
압축까지 해서 보관하는 방법도 있는데, 나는 그렇게까진 안하고.. latest 4시간만 보관하기로 했다.
2018/03/13 10:24 2018/03/13 10:24
문서를 열때 "open as"를 누르면 복사할 앱을 선택하고 그 앱을 누르면 문서가 복사되며 파일이 열리는 구조란건 다들 알 것이다.
그런데 어느순간부터 이상한게, 파일명에 마침표(.)가 들어가면 열리질 않는것이다. 쉐어UI 조차 뜨지 않는다. 너무 이상하게 생각해서 여러테스트를 해봤는데,

한글만 문제인줄 알았더니 영어 파일 모두 문제가 되고 있다. 그냥 .이 두개 들어가면 확장자로 인식하지 않아 determine 할 수가 없다.
한마디로 그냥 쉣이다..

다들 그냥 이 OS는 원래 그런가보다... 하고 넘어가는 모양이다. 아니면 파일명을 따로 인코딩하고 있다던지.. 근데 기본 메일앱을 쓰는 사용자들은 그게 안되니까 ㅡㅡ

애플에 버그리포트를 했다. 결과는 어떻게 될지 모르겠다. 글 내용이 수정될일이 있을지..
2018/01/31 14:53 2018/01/31 14:53
이걸 어떻게 설명해야할지 모르겠는데 나는 shell에서 사용하는건 다 똑같은 bash 인줄 알았다.

.sh를 실행할때 보통 이렇게 실행한다고 가정해보자. 권한을 적당히 주고 다음과 같이 실행하는게 일반적이다.

./aaaaa.sh


실행에 있어서는 별 문제가 없다.
그런데 얼마전에 쉘 스크립트를 짜는데, 

mysql query 결과를 command line 으로 실행해서 뽑고, 거기서 특정 문구를 regex로 처리해 변수로 쓰려고 시도 했다. 다음과 같은 모양이다
쉘 스크립트를 잘 몰라서 매끄럽진 않으니 참고만;

myvar=$(mysql -u ... -p ... -e "QUERY")
a=$(print %q " $myvar)
myvar2=$(echo $a | sed -rn 'REGEX....')
echo $myvar2


뭐 이런느낌으로 작성했다. 
그런데 아무리 돌려도 나오질 않는다. 정말 짜증나 미치려고 하고 있던 와중에 shell에서 쓰는 regex는 posix라고 부르는 문법을 사용한다.
단순 execute 가 아니라... bash 로 따로 실행을 해야 돌아간다고 한다.

요컨데

/bin/bash aaaaa.sh


로 실행하면 결과값이 다르다. 확장 익스텐션이랑 같이 실행되는 느낌이라고 할까..
간단한 작업들만 실행하게 하는 용도로 사용하다보니 쉘 스크립트도 이런게 있는줄은 처음 알았다. 어쨌든 bash로 실행하면 말끔하다.
2017/11/24 17:24 2017/11/24 17:24
mysqldump를 뜨다보면 자연스럽게 swap이 생기는것 같다.
이렇게 생긴걸 굳이 남겨둘 필요가 없어서 swapoff -a 와 swapon -a 를 통해 풀곤 했는데 자동화하려고 crontab에 추가했는데 돌아가질 않는다.

swapoff -a && swapon -a


.sh 에 작성해서 돌려봐도 안된다. 왤까하다 구글링으로 찾아보니 full path를 작성해줘야 하는 것 같다.

/sbin/swapoff -a && /sbin/swapon -a


잘된다.

2017/11/19 12:48 2017/11/19 12:48
제목이 점점 산으로 가는 기분인데..

Android 에 Intent 가 있다면 iOS에는 UIDocumentInteractionController가 있다.
annotation을 태워서 같이 보내거나 하는 등의 intent와 여러모로 비슷한 옵션인데, 기본적인 동작은 AirDrop을 호출해 파일을 다른 앱의 번들안에 저장한 후 파일을 오픈하게 하는 구조이다.

그런데..
10.3에서 돌아가는 다음 소스가 11에선 돌아가지 않는다.

 NSString* filepath = [[NSBundle mainBundle] pathForResource:@"Filename" ofType:@"pptx"]; 
NSURL *url = [NSURL fileURLWithPath:filepath]; 
self.documentController = [UIDocumentInteractionController interactionControllerWithURL:url]; 


아무리 로그를 봐도 그냥 파일 복사가 실패했다는 말만 나온다. 영문도 모르겠다. 더 열받는건 iOS의 기본앱(메모, 페이지)로는 또 열린다는 것이다. 그러다가 비슷한 처지의 글들을 보게 되었는데 결론은 그냥 iOS의 보안정책이 변했다.

AirDrop이란건 그냥 뻔한건데,
iOS에서 파일을 받을 경우 앱내에 있는 번들 스페이스에 저장하게 된다. 이 번들안에 저장된 URL을 서드파티앱에 넘기고, url을 받은 서드파티앱이 해당 url로 접근 후 파일을 복사해서 자신의 번들안에 저장하고 여는 구조라고 할 수 있는데, iOS 10까지는 이런 일련의 과정들이 허용되었으나 이젠 애플 기본앱이 아니면 접근 할 수 없다.

고로 접근할 수 있는 임시 디렉토리를 생성하고, URL을 다르게 전달해야만 앱이 오픈된다

 NSURL *tmpDirURL = [NSURL fileURLWithPath:NSTemporaryDirectory() isDirectory:YES];        // get /tmp folder path 
NSURL *fileURL = [[tmpDirURL URLByAppendingPathComponent:@"Filename"] URLByAppendingPathExtension:@"pptx"]; 
self.documentController = [UIDocumentInteractionController interactionControllerWithURL:fileURL];
 


정말 봐도봐도 거지같단 생각밖에 안든다. 여튼 이러면 열린다..
2017/11/13 15:14 2017/11/13 15:14
기업용앱은 ipa로 배포하곤 한다. 내부배포니까 굳이 앱스토어에 올릴 필요가 없기 때문이다.
원래는 ipa를 더블클릭하면 아이튠즈 창이 활성화 되고, 기기의 '앱' 메뉴가 열리며 설치예정, 삭제예정 등이 나왔는데 

아이튠즈 12.7이 업데이트 되면서 그런 메뉴가 다 사라졌다. 앱에 파일 넣던 기능은 '파일 공유'로 바뀌었고, ipa설치는 흔적도 없어져 어떻게 까나.. 싶었는데, 방법은 그냥 ipa를 드래그해서 '기기' 밑에 연결된 기기에 그냥 드래그 하면 깔린다. 어이가 없게 바뀌긴했는데...
.헤매지말고 잘들 깔아보시라..
2017/09/19 11:48 2017/09/19 11:48
iOS 코드중
[self.window setHidden] 옵션을 사용하는 경우가 있다. 파라미터에 NO를 줘 AppDelegate 에서 사용할 경우 앱이 새카맣게 되는 효과가 생긴다.
즉 화면이 내려갈때 창을 감춰버리기때문에 한순간도 보이지 않게 하는 효과를 낼수도 있지만 사실 거의 사용할 일은 없을 것 같은 기능이다.

이번에 회사앱을 만들면서 길고 긴 키보드 이슈가 있었는데, 앱에서 키보드를 치다가 홈버튼으로 나갔다 들어오면 키보드를 더 이상 사용할 수 없게 되는 황당한 버그였다.

이 문제의 결론은 iOS11에서 변경된 사항으로 인해 일어나는 버그였었는데, 내가 직접 테스트 해본건 아니고 벤더사의 메일 내용을 대부분 인용해서 블로깅한다. (아마 관계자 분들께서 들리실 수도 있을 것같다. 이런 삽질은 정말.. 유니크하다...)


1. [self.window setHidden:YES]


해당 코드가 실행되면 window의 visible의 false로 변경되며 key window도 아니게 된다
이 상태에서 [self.window setHidden:NO]를 실행하게 되면 iOS10과 iOS11에서 동작하는 로직이 달라 문제가 생긴다

2. iOS10


해당 윈도우 visible이 true가 되며 key widnow로 변경됨

3. iOS11


key window로 변경되지 않음 = 키보드 관련 이벤트가 동작하지 않는다


해결


iOS10과 11이상의 버전에서 달리 이벤트를 처리한다

iOS10 이하에서는
[self.window setHidden:NO];

만 사용해도 좋다.

iOS11에서는 다음과 같이 변경한다
[self.window setHidden:NO];
[self.window makeKeyWindow];


혹은,

[self.window makeKeyVisible];


로 작성하면 정상적으로 사용이 가능하다
2017/09/11 16:22 2017/09/11 16:22
사실 별로 중요한 내용은 아니다. 내용에 문제가 생기는것도 아니고..

나에게는 private repo가 있는데, 어느순간에 contribution graph 실적에 추가가 안되고 있다는걸 알았다.
public repo에 공헌했을때만 체크되는줄알았는데 옵션에 따라 설정할 수 있었다. 그런데 문제는, 실제 commit이 되었는데 어느 누구에게도 공헌이력이 남지 않았다는 것이었다.



수많은 commit이 있는데, 심지어는 거의 매일 커밋을 했는데!
그래프는 투명했던것이다. fantazm 저기로 들어가봐도 commit 이력이 없었다. 이상하게 여긴 나는 콜라보레이터를 살펴봤지만



없다...
애초에 콜라보레이터로 등록도 되지 않은 사용자가 커밋을 하고 있는 진풍경인것이다. 이상하게 여겨 github에 메일을 보내봤으나...
Hi,Sorry to hear you're having trouble. Can you verify that you have the correct email address set in your .gitconfig? You can check this in GitHub Desktop by going to the Options menu. The email address there needs to match the email address under your GitHub account in order for the commits to be properly attributed.

You can read more about this here:https://help.github.com/articles/why-are-my-commits-linked-to-the-wrong-user

Let me know if you have any other questions.

Cheers,
Steve

그러니까 그냥 github desktop 설정 문제라고 한다



메일을 받고 지금은 수정했지만, 처음엔 configure git에 fantazm이라는 아이디를 입력해놨었고,
저렇게 하면 콜라보레이터로 등록되지 않았더라도 내 원 아이디에 로그인되어있기때문에 commit을 할 수 있다는 이야기로 해석된다.
사실 공헌도 그래프에 목매고 싶지는 않지만.. 좀.. 이상하지 않나? 왜 저런 상황을 예외로 빼놨는지 모르겠다. commit이 안되야 정상아닌가? 아무권한도 없는데 저 아이디는?!
2016/09/20 14:53 2016/09/20 14:53

1 2 3 4 5