늘모자란, 개발

늘모자란, 개발


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
모바일 멜론에서는 노래 추가전 로컬 플레이리스트에서 노래를 검색후, 등록되어 있다면 추가 없이 등재된 노래를 트는 방식인데(환경설정에서 설정가능), PC버전은 어째 있어도 계속 추가되는 방식이다. (기존목록유지라는게 있는데 이걸 체크하고 노래를 틀면 다 날아간다. 언빌리버블)


결국 PC에서 이 노래가 갑자기 생각나 재생하면, 과거의 내가 추가했던 노래가 세개 네개씩 추가된다.



딱히 정은지님께 불만있는게 아닙니다. 1등이라서 튼거에요...
기분상의 문제겠지만 랜덤이 랜덤이 아니게 되는 것 같았다.
그래서 플레이리스트를 유니크하게 만들고 싶다고 생각하던 와중에 멜론이 설치된 경로에 플레이리스트가 저장되고 있음을 알 수 있었다.

열어보니 json 포맷으로 뭔가 잔뜩적혀 있었다.
이녀석들을 처리해주면 되겠다고 생각해서 임의로 지워도 보고 넣어도 보고 했는데 그대로 되는게 확실했다.

그래서, 요녀석을 python을 이용해 중복을 제거해보기로 한다.
독자분의 플레이리스트를 책임지지 않습니다. 저장해놓고 따라하세요...

멜론의 json은 Now playlist라는 대범주내에서 다음과 같은 형태로 저장된다.

{"ALBUM":"장범준 1집","ALBUMID":"2275373","ARTISTID":"","ARTISTLIST":[{"ID":"648551","NAME":"장범준"}],"COMMONINFO":"330001001010000001100000000000000000","CONTENTSFLAG":"1000000000000000","EDUNAME":"","ID":"4821172","ITEMIDTYPE":1,"MVADULTRANK":4,"MVTYPE":0,"PHONEDECFLAG":"1110000000000000","PLAYTIME":203,"SOURCEPATH":"","SOURCETYPE":66,"STATICID":"26020103","THUMBNAILIMAGE":"http://cdnimg.melon.co.kr/cm/album/images/022/75/373/2275373_th120.jpg","THUMBNAILIMAGE_120":"http://cdnimg.melon.co.kr/cm/album/images/022/75/373/2275373_th120.jpg","THUMBNAILIMAGE_500":"http://cdnimg.melon.co.kr/cm/album/images/022/75/373/2275373_500.jpg","TITLE":"주홍빛 거리"}


이때 가장 필요한것은 id이다. id만 넣어도 재생은 된다. 다만 로컬플레이리스트에 제목도 안나오고, 썸네일도 안나온다.
노래를 재생시키면 리얼타임으로 불러오는게 아니고 추가할 당시에 모든 정보를 불러와 json에 넣는 방식인것 같다. 어쨌든, id로 중복체크를 하면 되겠다.

멜론이 설치된 경로에서 파일을 읽어와 출력하려니 잘 되지 않았다. 한글 깨짐 문제인듯 보여 여러 블로그를 참조했으나 도저히 유니코드의 늪에서 벗어나질 못했다. 무엇이 문제란말인가? 그러다가 이녀석이 UTF-8이 아니라 다른형태로 인코딩 되어 있을지 모르겠다는 불길한 생각을 하게 되었고 그게 정답이었다...

나는 이 툴을 이용해 체크를 해봤는데 (PE를 읽어도 된다), 멜론의 로컬 플레이리스트 인코딩은 UTF-16LE이다. 
다국어가 많기때문에 합당한 처사라고 생각되었다. 늦게 눈치챈 나만 탓하기로 했다.
UTF8이 이젠 대세가 아닐테니.. 어쨌든,  이런 형태로 인코딩해주고 json객체로 로드해주면 드디어 파일을 읽어들일 수 있게 된다..

removeDuplicate = { each['ID'] : each for each in jsonObj }.values()


대략 이런식으로 코드를 적어주면 중복이 싹 날아가는데, 금방 끝날줄 알았더니 멜론에서 읽질 못한다. ㅡㅡ 백업을 떠놓고 하길 정말 잘한 것 같다. 간과한게 있었으니.. utf8로 인코딩된 이녀석을 다시 utf-16le 꼴로 만들어줘야만 했던것이다... 그런데 몽땅 다 인코딩하니 또 못읽는다... 한글 파일명이 유니코드로 변신한것이다... "\u120\u359" 막 이렇게 생긴거 있잖아... 다 만들었다 생각했는데 한글이 발목을 턱 잡았다.


그래서 별에별 쌩쇼를 다했다. 한글만 빼내서 replace해볼까 요렇게도 생각하다가... 
결론은 자승자박이었다. 위 툴 스샷은 UTF-8로 저장을 했을때 실패한건데, 정상적인 alst파일을 보면 UTF-16LE라고 나온다.

헌데, python의 codecs를 이용할땐 UTF-16으로만 저장을 해줘야했다. LE붙이지말고.........ㅎ ㅏ.....sigh.......
유니코드를 뭐 앞에 써주고 이러라는데 결국 인코딩은 삽질싸움이다.. (위 인코딩 이슈들은 python3에서 거의 해결된 문제라고 한다. 최신쓰자..)

어쨌든 간만의 긴 삽질 끝에 완성되었다.
요 파이썬 파일을 돌리면 중복이 싹 날아가고, 멜론을 껐다키면 중복된 노래들이 날아감을 확인할 수 있다.
요녀석을 쓰고 싶으면 여길 방문해주세요. 쓸데없는 삽질 글 읽어주셔서 감사합니다!



===

2017.07.24 수정

스크립트를 가만 짜놓고 보니 이 python script를 누가 얼만큼 수정해서 쓸지 생각이 들더군요. 
그래서, 자동으로 플레이 리스트를 찾고 (레지스트리로부터), 백업도 알아서 만들고, 엔터 몇번 누르면 끝나도록 프로그램을 작성했습니다.

별 다른 프로그램이 필요할 것이라고 생각은 들지 않지만,  관리자 권한은 필요할 수 있습니다
(레지스트리를 읽고, 프로세스 리스트를 읽습니다)



여기서 다운로드 받아 실행하시면 됩니다.
2016/04/15 11:18 2016/04/15 11:18
PHP 갖고 논지는 오래됐다.
문득 이런생각이 든게, 프로젝트도 커지고 했는데, 언제까지고 나만 이 프로젝트를 관리하려나 싶어졌다.
(대부분의 한국인들은 editplus나, sftp, ftp를 지원하는 에디터를 이용해 소스를 바로 수정해서 올릴거라 생각한다.
왜냐면 PHP는 별도의 빌드가 필요없기 때문이다. 아니면 별도의 개발서버를 둬서 한번에 다 덮어쓴다던가..)

누군가와 협업하게 된다면 버전관리와 diff 체크를 해야할텐데, 지금까지의 형태론 도저히 답이 안나왔다.

그래서, delpoy를 하는 방법에 대해 찾아보기로 했다.
우선 phpschool 과 생활코딩에 물어보니, php는 빌드가 필요없이 즉각 적용되기때문에 어떻게든 올리기만하면 된단다.
그래서... 다들 따로 관리는 안하는구나 생각했다.

나는 우선 버전관리는 별도의 git 서버를 구축하지 않을것이라 굳게 다짐했기때문에,
github를 이용하기로 했다. private repo를 다섯개를 사용하기때문에 비공개적으로 관리할 수 있을것이라 생각했다.
깃헙을 사용하지 않겠다면 gitlab이나 bitbucket 과 같은 서비스도 있으니 고려할 수 있겠다.

우선 ftp 로 파일을 싹 받고 .gitignore를 설정했다. 자주 바뀌고 추가되는 이미지들은 버전관리할 필요가 없기 때문이다.
http://dolfalf.tistory.com/58
http://trend21c.tistory.com/1471

두곳을 참조해 적당한 룰을 만들면된다.
로컬 세팅은 귀찮음에 의거해 따로 하지 않기로하고, push 관리같은것도 github desktop을 사용하기로 한다.
즉, IDE에서 수정한 내용을 compare하고 push 하는 git의 기능을 그냥 프로그램에 전적으로 (-_-) 의존하기로 해본다.

git사용을 극대화하기 위해서, github에서 만든 atom 에디터를 사용하기로 했다.
atom은 현재 .git와 비교해 달라진 파일, 생성된 파일을 별도로 표시해준다.



내용을 변경했다면 github desktop에서도 확인할 수 있다.



여기서 pull request나 commit을 관리할 수 있다.
이후 sync 버튼을 클릭해 파일을 싱크하고, 해당 작업이 완료되면 서버의 ssh로 들어가 git 명령어를 친다.
서버에서 git 명령어를 사용할 수 있도록 설치되어 있어야한다. (apt-get install git)

SSH등 여러 방법이 있지만 나는 아주 귀찮았기 때문에, 별다른 등록이나 인증과정없는 HTTPS를 사용하기로한다.
사용법은 이렇다.

git clone https://{user}:{password}@github.com/{user}/repository.git {direcotry}
git pull https://{user}:{password}@github.com/{user}/repository.git {direcotry}


git clone과정은 현재 버전을 받기 위해서 하는 과정이고, 실제 가장 많이 쓰는 deploy는 git pull이다.

사실 git에 대해 자세히 알고 싶을수도 있는데, 그런 사람들을 위해 쉽고 빠르게 이해할 수 있는 여러 링크를 준비했다.
http://classic.scottr.org/presentations/git-in-5-minutes/?hc_location=ufi
http://blog.outsider.ne.kr/865
http://blog.outsider.ne.kr/866

특히 outsider 님의 글은 이 프로세스를 거의 모두 설명하다시피 하고 있으니 참고하면 좋겠다.

git pull을 하면 다음과 같은 화면을 보게되고, 정상적으로 deploy되게 된다.
# git pull https://{user}:{password}@github.com/{user}/repository.git {direcotry}
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 7 (delta 6), reused 7 (delta 6), pack-reused 0
Unpacking objects: 100% (7/7), done.
From https://github.com/{user}/repository
 * branch            HEAD       -> FETCH_HEAD
Updating ...
Fast-forward
 *.php  |    2 +-
 *.php  |    2 +-
 *.php |    2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)


나처럼 버전관리는 하고 싶은데, 귀찮다면 이렇게 하는 방법도 있다고 소개해본다.
2015/09/29 16:56 2015/09/29 16:56