• Layout Inflation as Intended →

    안드로이드 개발을 하다 보면 LayoutInflaterinflate(int, ViewGroup)inflate(int, ViewGroup, boolean)는 꽤 익숙하다. 하지만 다음 두 줄의 코드가 어떻게 다른지 아는 사람은 그리 많지 않을 것 같다. 실제로 Android Lint는 한쪽 코드는 피하도록 권하고 있다.

    inflater.inflate(R.layout.my_layout, null);
    inflater.inflate(R.layout.my_layout, parent, false);
    

    Dave Smith가 이 두 코드의 비교와 함께, 바른 Layout Inflation 방법에 대해 설명한 글이 있어 소개한다.

  • Fragment Transaction & Activity State Loss →

    FragmentTransactioncommit() 했을 때 Activity의 onSaveInstanceState(Bundle)이 실행된 후라면 다음과 같은 에러 메시지를 보게 된다.

    java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
    

    이 문제의 원인이 무엇인지, 어떻게 이 Exception을 피할지, 그리고 commitAllowingStateLoss()가 왜 마지막 수단이 되어야 하는지 잘 설명한 글이 있어 소개한다. Alex Lockwood가 쓴 Fragment Transaction과 Activity State Loss에 관한 글이다.

  • Trailing whitespace is evil. Don't commit evil into your repo. →

    Jared Barboza가 쓴 줄 끝 공백에 관한 글이다.

    난 최근에 다양한 사람/언어/편집기와 함께 많은 프로젝트를 진행해 왔다. 우리들 대부분은 Git 초보자였고, 각 프로젝트는 줄 끝 공백에 관한 문제가 있었다.

    경력 있는 개발자로만 이루어진 팀이라고 해도 이런 문제는 발생하기 마련이다.

    줄 끝 공백은 당신의 저장소에서 상당히 많은 문제를 일으킬 수 있다. 실제로 바뀐 것은 공백일 뿐인데도 그 줄에 변경 사항이 있다는 잘못된 diff를 만든다.

    이는 개발 과정에서 나중에 실제 파일의 변경 사항이 무엇이었는지 찾기 불가능하게 만든다. 대부분의 오픈 소스 프로젝트 대표들은 이를 알고 있고, 그들 대부분은 줄 끝 공백을 없애지 않은 풀 리퀘스트를 거절할 것이다.

    이후 글에서는 Visual Studio와 Sublime Text 2에서 줄 끝 공백을 제거하는 방법과 git hook을 통해 커밋에 줄 끝 공백이 포함되지 않도록 하는 방법을 소개하고 있다.

    나는 Android Studio에서는 파일 저장 시 모든 줄 끝 공백을 지우고, Vim에서는 줄 끝 공백에 하이라이트를 입혀 쓰고 있다.

    highlight ExtraWhitespace ctermbg=red guibg=red
    autocmd BufWinEnter * match ExtraWhitespace /\s\+$/
    autocmd InsertEnter * match ExtraWhitespace //
    autocmd InsertLeave * match ExtraWhitespace /\s\+$/
    if version >= 702
      autocmd BufWinLeave * call clearmatches()
    end
    
  • Twitter Link Bookmarklet →

    Dave Bradford의 트위터에 관한 팁 Twitter Profile Bookmarklet을 봤다. 직접 써 보니 기능이 추가됐으면 더 좋을 것 같아 추가했다.

    일단, 원글에 있는 코드의 기능은 간단하다. 모바일 사파리를 통해 트위터 계정을 보다가 북마크 버튼을 한 번 누르면 Tweetbot에서 볼 수 있게 된다. 여기에 브라우저를 통해 ‘트윗’을 보고 있다면 Tweetbot으로 바로 그 트윗을 볼 수 있게 기능을 추가했다. OS X에서도 동일하게 작동한다.

    var url = document.URL;
    var match = url.match(/status(?:es)?\/(\d+)/i);
    var tweetbotUrl;
    if (match == null) {
        tweetbotUrl = url.replace(/https?:\/\/(mobile\.)?twitter\.com\//, "tweetbot:///user_profile/");
    }
    else {
        tweetbotUrl = "tweetbot:///status/" + match[1];
    }
    window.location = tweetbotUrl;
    

    원리는 간단하다. 현재 페이지 URL에 statusstatuses가 포함되어 있으면 트윗을 열고, 그렇지 않으면 계정을 보여 준다. 아래 코드를 북마크 해두고, 필요할 때 눌러주면 된다.

    javascript:var%20url=document.URL;var%20match=url.match(/status(?:es)?%5C/(%5Cd+)/i);var%20tweetbotUrl;if(match==null)%7BtweetbotUrl=url.replace(/https?:%5C/%5C/(mobile%5C.)?twitter%5C.com%5C//i,%22tweetbot:///user_profile/%22)%7Delse%7BtweetbotUrl=%22tweetbot:///status/%22+match[1]%7Dwindow.location=tweetbotUrl;
    

    기기에 Tweetbot 2와 Tweetbot 3가 모두 깔려 있을 때 Tweetbot 2로 열리는 점은 아쉽다.

    via Yoon Jiman (archive)

  • Global Git Ignore →

    usevimAlex Young이 쓴 global gitignore에 관한 글이다.

    나는 몇 년간 .gitignore*.sw?을 넣어 왔는데, Vim을 쓰지 않는 사람들은 특정 편집기를 위한 .gitignore 항목을 보고 싶지 않아 할 수도 있다는 걸 깨달았다. 편집기들은 임시 파일과 복구 파일을 각자 다른 방식으로 관리하기 때문에 이 설정을 모두에게 강요하는 것은 과해 보인다.

    이것보단 global 옵션을 사용하는 것이 낫다. git config --global core.excludesfile ~/.gitignore를 실행해라. 그러면 거기에 *.sw?을, 어쩌면 *~도 넣을 수 있다. 난 .DS_Store를 추가할 텐데, Windows 개발자들은 여기 신경 쓸 필요가 없기 때문이다. 그리고 그들은 아마 Thumbs.db를 추가해야 할 것이다.