2011년 11월 29일 화요일

LIFE IS SHORT.









This IS YOUR LIFE.
DO what you LOVE, and DO it OFTEN.


If you don't like something, CHANGE IT.
If you don't like your JOB, QUIT.


If you don't have enough time, stop watching TV.
If you are looking for the love of your LIFE, STOP; They will be waiting for you when you START DOING THINGS YOU LOVE.


Stop over analyzing, all emotions are BEAUTIFUL.
When you EAT, APPRECIATE every LAST BITE.


LIFE IS SIMPLE.


Open your MIND, ARMS, and HEART to NEW THINGS and PEOPLE, We are UNITED in our DIFFERENCES.


Ask the next person you see what their PASSION IS, and SHARE your INSPIRING DREAM with THEM.


TRAVEL OFTEN; Getting LOST will help you FIND YOURSELF.


Some opportunities only come ONCE, SEIZE them.


Life is about the PEOPLE you MEET, and the things you CREATE WITH THEM so go out and START CREATING.


LIFE IS SHORT.


LIVE your DREAM and SHARE YOUR PASSION.











페이스북 타임라인을 보다가, 과거에 어느 블로그에서 보고 퍼왔던 글을 보고 느낌이 또 새로워서 블로그에도 올려 봅니다.
과거에 이 글귀를 봤던 블로그는...




2011년 11월 19일 토요일

AdMob 4.3.1 설치시 빌드 타겟 설정. "You must have AdActivity declared in AndroidManifest.xml with configChanges"


이미지는 내용과 아무 상관 없습니다.


AdMob의 현재 최신 버전은 4.3.1이다.
여기선 프로젝트가 com.google.ads.AdActivity 라는 Activity를 AndroidManifest에 선언하길 요구하는데, 이와 함께 다음의 configChanges 속성을 요구한다.
keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize

문제는 상당수의 속성들이 3.2 이상에서 지원된다는 것. 때문에 빌드 에러가 난다.

3.2 이상에서만 지원되는 속성을 삭제하면 빌드는 되지만, 광고가 나오지 않고, 까만 박스에 "You must have AdActivity declared in AndroidManifest.xml with configChanges" 라는 문구만 빨간 색으로 나오게 된다.
AdMob 문서에서 설명한 모든 configChanges 속성을 요구하기 때문이다.


3.2 이상 앱을 개발하면 되겠지만, 이 경우 하위 호환성에 문제가 생길 수밖에 없다.






해결책은, 앱의 실행환경 타겟은 그대로 두고, 빌드 시에만 3.2 이상 SDK를 사용하는 것이다.
참고로, 앱의 실행환경 타겟은 AndroidManifest 의 uses-sdk 항목에서 설정 가능하다. 이걸 변경시키면 문제는 해결 안되고, 하위 호환만 안된다.


먼저, SDK Manager 를 이용해 3.2 이상의 Android SDK를 받고,
사용 중인 빌드 시스템을 이용해, 빌드 시에 3.2 이상의 SDK를 이용하도록 하면 되겠다.


이는 사용 중인 빌드 시스템에 따라 달라지겠는데, 이클립스에서 개발중이라면, project.properties 라는 파일이 생성되어 있을 것이다.
여기에 보면 target 이라는 값이 있는데, 그 값을 android-13으로 수정해 주면 된다.
target=android-13
참고로, AdMob 광고가 나타나기 위해선 약간 시간이 필요하다. "You must have AdActivity declared in AndroidManifest.xml with configChanges" 문구만 나오다가 이젠 아무것도 안나온다면 문제가 해결된 것이다. 좀 더 기다려 보자.





빌드 시 사용할  SDK 타겟만 바꿨으므로, 하위 버전의 Android 기기에서도 3.2 SDK 에서 제공하는 하위 호환이 된다. 기본적으로 Android 는 하위 호환을 지키기 때문에 큰 문제는 발생하지 않는데, 3.2에서 deprecated 되거나 한 하위 버전 SDK의 API는 사용이 불가능하다.
이를 위해선 또다른 꼼수가 필요한데, 아래 참조 링크에서는, 3.2 에서 deprecated 된, 우리가 사용하고자 하는 API를 호출하는 library를 하위 버전 SDK를 이용해서 빌드하고, 이 library를 이용하는 방법을 이용했다.




참고 링크 :
http://stackoverflow.com/questions/7947165/admob-implementation-error/7951412#7951412
http://code.google.com/intl/ko/mobile/ads/docs/android/fundamentals.html

2011년 11월 7일 월요일

Hackers - 해커, 그 광기와 비밀의 기록


스티븐 레비의 작품, Hackers.
1970년대 MIT의 최초 해커들부터 하드웨어 해커(80년대), 게임 해커(90년대)로 대변되는 해커들의 이야기를 다루고 있다.
해커 특유의 문화에 대한 이야기가 많기 때문에, 컴퓨터 범죄자가 아닌 해커 자체에 대해 궁금증을 가지고 있다면 읽을 만 하다.
소프트웨어 개발을 단순히 돈을 벌기위한 수단이 아니라 즐거움의 대상으로 여기고 있는 분이라면 자신과 같은 성향의 선배들의 이야기를 재밌게 읽을 수 있을 것이다.

보통은 하드웨어 해커 이야기에서 나오는 스티브 와즈와 스티브 잡스의 애플 이야기, 빌게이츠와 홈브루 클럽의 소프트웨어 저작권 이야기 등에 흥미를 얻을 수 있고, 90년대 게임 해커 시대 이야기에선 어린 시절 90년대 초 어드벤쳐 컴퓨터 게임을 즐겼던 사람이 추억을 되살릴 수도 있을 것이다. 리처드 게리엇 이야기도 나온다.

하지만, 해커 자체에 대한 심도 깊은 이야기를 원한다면 역시 해커 문화의 성격과 태동을 다룬 70년대 MIT 철도 클럽(TMRC) 로부터 시작한 해커들 이야기를 재밌게 읽을 수 있을 것이다.
마지막 에피소드에서는 그 해커 문화가 어떻게 비극에 처하고 위험에 빠지는지도 슬프지만 담담하게 이야기 하고 있다.

개정본도 나와 있는데, 개정본은 번역본은 아직 없다. 개정본에선 마지막 챕터에서 짧게나마 이후의 동향과 페이스북의 마크 주커버그에 대한 이야기도 있다.

아래는 그중 일부 부분의 발췌.




이들의 단골 식사메뉴는 거의 언제나 중국요리였다. 중국요리는 값싸고 양이 많다는 이점도 있었지만, 그들이 이것을 즐긴 가장 큰 이유는 한밤중에도 배달된다는 점이었다. ... 중국음식은 일종의 시스템이었고 해커들은 마치 새로운 리스프 컴파일러를 발견했을 때와 마찬가지로 이 시스템에 대해 지칠 줄 모르는 호기심을 발동시켰다. - "그린블러트와 고스퍼", p.102 -



"옛날에 내가 선더랜드 밑에서 일하던 시절, 나는 8시부터 5시까지 시계바늘처럼 시간을 지켜 일하는 것에 대해 불평을 늘어놓곤 했습니다(그것은 해커의 모드, 즉 자유로운 작업 방식이 아니었으니까요). 그런데 이제는 내가 8시부터 5시까지 일할 수 있는 프로그래머를 필요로 하고 있습니다. 그것은 마치 히피에서 자본가로 혹은 어떤 다른 것으로 변모하는 것과 마찬가지였습니다. 나는 자신이 배반당했다는 느낌을 가지고 있는 프로그래머들이 무수히 많다는 생각을 갖고 있었습니다"
 - "마법사 대 마법사", 켄 윌리엄스, p.539 -



"저는 소프트웨어가 소유될 수 있다는 생각을 믿을 수가 없었습니다. 왜냐하면 그런 관습이야말로 인류 전체에 대한 사보타지이기 때문입니다. 그것은 사람들이 프로그램의 존재 자체로부터 얻을 수 있는 최대한의 이익을 가로막는 저열한 행위입니다."
 - "에필로그 - 진정한 해커의 종말", 리처드 스톨맨, p.563 -


"... 그 책은 '최후의 인디언 이시'라는 제목이었습니다. 그것은 한 인디언 부족의 마지막 생존자에 대한 내용이었는데, 처음에는 그와 그의 가족들이 있었지만 마침내 그들은 하나씩 하나씩 죽어갔습니다."
 그 마지막 인디언이 느꼈던 감정이 바로 스톨맨의 느낌이었다.
"저는 죽어버린 문화의 최후의 생존자였습니다. 그리고 저는 더 이상 세상에 속하지 않는 사람이었습니다. 어떤 의미에서 저는 죽어야만 한다고 생각했습니다."
 - "에필로그 - 진정한 해커의 종말", 리처드 스톨맨, p.575 -

[감상] 개발자를 부탁해



우연히 어느 블로그에서 서평을 접한 후, 재밌겠다 싶어 책을 질렀다.

책은 기본적으로 남중-남고-공대의 길을 걸은 평범한 남성 개발자의 독특한 특성을 바탕으로 연애, 취업, 직장생활 등, 사회에서 겪게 되는 이야기를 하고 있다.

개발자 개무시 시대에 발맞춰 출간된 책으로 보이고, 소비자 층을 자극하기 위해 개발자의 연애에 대한 조언이라는 부분을 홍보에 집중시킨 것으로 보이는데,
저자가 스스로 자신은 타고난 개발자는 아니고, 어쩌다 보니 이쪽으로 발을 들이게 된 여성이라 이야기 하는 부분에서는 조금 몰입도가 떨어지고(원하지 않았는데 어쩌다 보니 개발에 발을 들이게 된 개발자들이라면 오히려 더욱 몰입이 될 것 같다),
연애 파트는 공감이 심하게 가고 굉장히 재미있게 읽을 수 있지만, 사실 다 머리로는 알고 있는 내용들인지라 크게 와닿지는 않는다.

오히려 취업, 직장생활 등에 대한 저자의 경험이 듬뿍 담긴 부분들이 많이 와닿는다.
저자의 영국 이민/이직기는 특히 본인도 많은 괴로움과 번민을 느끼며 시도했기 때문인지, 상당히 정보가 구체적이어서 외국으로의 이직을 생각하는 사람은 한번쯤 볼만할 것 같다.

직장생활 이야기도 저자의 생생한 경험을 바탕으로 취업하기 전의 개발자들이 일반적으로 생각하는 회사 생활과 실제 생활하게 되면 느끼게 되는 회사 생활, 그 안에서 주의해야 할 것들이 상당히 꼼꼼하게 묘사되고 있다.


하지만 뭐니뭐니 해도 이 책의 가장 멋진 부분은, 저자가 여성이기 때문인지는 몰라도 자신의 경험을 이야기 하고 털어놓는 가운데, 단순히 꼼꼼하고 생동감 있는 정도가 아니라, 직장생활 선배로서 후배를 진심으로 위하는 마음으로 쓴 것 같은 세심한 배려가 느껴진다.
이 부분이 사실을 가능한 객관적이고 사실적으로 전달하는게 목표가 되곤 하는, 개발자 대상 서적들(대부분 개발자 대상 서적은 개발자가 쓰고, 개발자의 일반적 글쓰기 목표가 그러하기 때문이리라)과 다른 부분인 것 같다.

마지막으로, 읽으면서 나름 인상깊었던 부분을 발췌해 본다.
"응, 나 하버드 갈 정도의 성적이랑 SAT 점수도 나왔어. 아이큐로만 보면 뭐든지 할 수 있었다고도 해. 하지만 가능성은 가능성일 뿐이고, 가능성에 매달리다가 인생 말아먹는 건 27년으로 족하다고 봤어. 내 가능성을 보고 알아달라고, 나 보이는 것보다는 훨씬 대단한 사람이라고 인정해 달라는 투정도 이젠 그냥 그만두기로 했어."
이제는 안다. 현실을 그대로 받아들이기보다는 다른 것에 매달리면서 현실을 미래로 밀어버리는 쪽을 택하려 했다는 것. 식당에서 그냥 웨이터로 일하는 것보다는 뭔가 대단한 시험 공부를 하면서 '이건 그저 임시로 할 뿐이야'하는 쪽이 마음이 편하기 때문에, 난 평생을 그렇게 살아왔다는 것. 하버드 입시 준비를 하는 동안은 하버드에 갈 수도 있는 사람이지만, 그냥 저임금 평사원으로 취업해 버리면 내 가능성은, 내 꿈은, 내 인생은 거기에서 끝나버리는 것 같아서 그걸 놓기가 힘들었다고.

2011년 10월 29일 토요일

최신 AOSP 의 CtsVerifier 에서의 빌드 에러.


얼마전 복구된 AOSP 소스를 받아 빌드해 보면 CtsVerifier 에서 아래와 같은 에러 메세지를 뿜으면서 빌드에 실패한다.

cts/apps/CtsVerifier/src/com/android/cts/verifier/PassFailButtons.java:191: onCreateDialog(int,android.os.Bundle) in android.app.Activity cannot implement onCreateDialog(int,android.os.Bundle) in com.android.cts.verifier.PassFailButtons.PassFailActivity; attempting to assign weaker access privileges; was public
    private static <T extends android.app.Activity & PassFailActivity>


이는 Sun JDK 가 아닌, Open JDK 를 쓰기 때문이다. Ubuntu 기본 JDK는 Open JDK 다.
Open JDK 가 아직은 좀 불안정하다고 한다. Google 측에서도 Sun JDK를 권장하고 있다.
자신이 쓰고 있는 jdk 를 확인해보자.



$ java -version
java version "1.6.0_20"
OpenJDK Runtime Environment (IcedTea6 1.9.9) (6b20-1.9.9-0ubuntu1~10.04.2)
OpenJDK 64-Bit Server VM (build 19.0-b09, mixed mode)


Open JDK를 쓰고 있음을 알 수 있다.

아래의 명령으로 Sun JDK 를 설치, 사용하도록 설정한다.


$ sudo add-apt=repository "deb http://archive.canonical.com/ lucid partner"
$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
$ sudo add-apt-repository "deb-src http://archive.canonical.com/ubuntu lucid partner"
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk
$ sudo update-java-alternatives -s java-6-sun


이제 다시 java 버전을 확인해보면, 아래와 같이 Sun JDK를 쓰고 있음을 알 수 있다.


$ java -version
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)




이제, 빌드하면 성공할 것이다.

2011년 10월 18일 화요일

맥북 에어 11" 사용 1주년 소감.

작년 10월, 미국 출장을 나가 있던 난 당시 판매를 시작한지 얼마 되지 않았던 신형(물론 또다시 성능은 업그레이드 되고 가격은 그대로인 신형이 나왔지만) 맥북에어 11" 모델을 질렀다.

1년 사용해보고 소감이나 정리해 보려 했는데, 어느새 1년이 지났다.




1. 외관
뭐니뭐니해도 맥북에어는 외관이 일단 먹고 들어간다. 지금은 여기저기서 많이 보이지만, 처음 사들고 귀국했을 땐 한국은 아직 판매를 시작하지 않았을 때라 밖에서 펴들면 여기저기서 시선이 느껴졌다.

2. 이동성
태블릿 PC 에 비견하고 싶을 정도.
얇고 가벼운 만큼, 이동성은 최고다.
하지만, 1kg 정도의 중량은 잠시 들었을 땐 깃털 같지만, 동일 부피 대비 책에 비해 중량이 많이 나가기 때문에, 가방에 책도 좀 넣고 오래 들고 다니면 어깨가 약간 아프긴 하다.
하지만 역시 들고 다니기 편하기 때문에, 실외에서 코딩할 때 최고다.

3. 배터리
이건 이동성이랑 좀 겹치는 항목이긴 하지만... 30일의 대기시간, 10시간의 구동시간이라고 살당시 광고하고 있었는데.
10시간까진 좀 오바인 것 같고, 이클립스 띄우고 웹페이지도 30여 탭 열고 열심히 가지고 놀면 대략 4시간정도 가는 것 같다.
하지만 대기시간은 확실히 배터리 소모가 거의 없기 때문에, 그정도면 충분한 것 같다. 충전기는 집에 두고 들고 다닌지 오래됐다.

4. 성능
올해 나온 모델은 i5, i7 탑재이니 성능에서도 최고이지만, 내 경우 구매 당시 가장 많이 망설여졌던 부분이다. 내가 산 모델은 intel core2 duo를 탑재하고 있기 때문이다.
하지만 SSD 덕에 큰 무리는 가지 않는다. 애초에 게임도 하지 않고, 데스크탑을 메인으로 쓰고 어디까지나 실외에서의 서브 컴퓨터로 소스 리뷰 정도로 쓸 목적이었기에, 성능으로 고심해 본 적은 없다.
다만, 영화를 오래 틀면 팬이 돌아가기 시작하는데 그건 좀 신경쓰인다.

5. 화면 크기
주변에 맥북에어 사려는 사람들이 11"냐 13"냐로 고민하는 경우를 좀 보는데, 이동성이 목표라면 11", 메인으로 쓸거라면 13" 이상도 상관 없을 것 같다.
11"도 독을 치우면 그다지 화면 보는데 문제 있는 수준은 아니다.
더구나 11"는 거의 A4 용지 정도 크기라서, 그냥 책가방에도 잘 들어간다.


6. OSX
조금 적응기간이 필요하긴 하지만, 익숙해지면 더할나위 없이 편하다.
인터넷 뱅킹이나 액티브X는 가상머신에 Windows 깔면 되긴 하는데, 난 어차피 서브 컴퓨터 목적이기 때문에 데스크탑에서만 인터넷 뱅킹을 쓴다.

7. 아이패드? 맥북에어?
원체 슬림하다 보니 아이패드와도 조금 포지셔닝이 겹쳐버리는 문제가 있다.
나는 데이터를 소비하려는 목적이라면 아이패드(혹은 다른 태블릿 컴퓨터), 데이터를 생산하려는 목적이라면 맥북에어(혹은 다른 울트라 슬림 노트북)가 맞다고 생각한다.
이동성은 분명히 태블릿 컴퓨터가 압도적이고, 맥북에어는 할 수 있는 일에 있어 분명히 태블릿 컴퓨터에 압도적이다.
내 경우는 코드 리뷰와 간단한 테스트 코드 작성이 주목적이었기에 GNU 툴과 빌드 시스템 구축이 필요해서 일고의 고민 없이 맥북에어를 선택했다.

2011년 10월 16일 일요일

Selector 를 이용해 widget(Button, CheckBox 등)의 모양 바꾸기

Gingerbread 부터 많이 나아졌지만, Android 의 기본 widget(버튼, 체크박스, 등등...)은 별로 예쁘지 않기로 유명하다.

특히 버튼이나 체크박스의 경우 앱의 디자인에 어울리는 모습으로 커스터마이징 해야 하는 경우가 많은데, selector 를 이용하는 게 편하다.

기존 widget 과 전혀 다른 동작을 하길 원하는 커스터마이징이라면 상속을 받아 새로운 widget 을 만들어야겠지만, 단순한 모양 변화라면 selector 가 적당하다.

selector 는 Android resource system 에서 사용되는 XML drawable 의 element 중 하나로, 말 그대로 selection 가능한 drawable 을 의미하며, 내부 element 로 각 상황(포커스를 받았는지, 터치 되었는지, 포커스를 잃었는지, 비활성화 되었는지 등) 에 따른 형태를 표현할 수 있다.

0. 커스텀해서 사용할 이미지를 준비한다.
이미지 파일을 준비해서 res/drawable 아래 적당한 위치(drawable-hdpi 가 될수도 있고, drawable-mdpi 가 될수도 있고...)에 넣는다.
꼭 이미지가 아니라 xml drawable 이 될수도 있겠다.

1. res/drawable/ 아래에 적당한 이름의 xml 파일을 만들고 다음과 같은 형식으로 입력한다.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="true"
        android:state_checked="true"
        android:drawable="@drawable/my_check_on" />

    <item android:state_enabled="true" 
        android:state_checked="false"
        android:drawable="@drawable/my_check_off" />

    <item android:state_enabled="false"
        android:drawable="@drawable/my_check_disabled" />
</selector>

위의 예는 체크박스를 위한 drawable 을 정의한 것으로, 활성화 되었고 체크 되었을 때에는 my_check_on.png 를, 활성화 되었고 체크되지 않았을 때에는 my_check_off.png 를, 비활성화 되었을 때에는 체크 여부에 관계없이 my_check_disabled.png 를 보여주게 될 것이다.
기타 상태 정보를 위해 사용가능한 selector 와 item 의 attributes 정보는 다음 링크에서 확인 가능하다.

2. 사용할 widget 의 적절한 속성으로 앞서 작성한 xml 파일의 이름을 준다.
적절한 속성은 사용할 widget 마다 다르다. Button 이라면 android:background 를 지정해 주면 되고, 예를 들고 있는 CheckBox 라면 android:button 이다.
예를 들면 다음과 같은 식이다.

    <CheckBox android:layout_height="wrap_content"
        android:text="" android:id="@+id/my_checkbox"
        android:layout_width="wrap_content"
        android:layout_gravity="center"
        android:button="@drawable/my_checkbox_drawable_selector"      
    />


2011년 10월 6일 목요일

RIP, My great hero who changed the world.


Apple 을 별로 안좋아한다. Steve jobs 또한 좋아하지 않는다.
구매해본 Apple 제품은 작년 10월에 구입한 MBA 11" 하나가 유일하다.
하지만, 나는 Steve jobs 와 그의 Apple 을 존경했다.

존경합니다, 그리고 감사합니다.
세상을 바꾼 위대한 영웅, 편안하시길.




---------------------------------------------------------------------------------------------------------------------------------
추모하는 의미로, 몇가지 영상 및 정보를 여기에 모아볼까 합니다.

스티브 잡스 본인의 육성으로 녹음된 The crazy ones 영상.
Apple 의 유명한 광고 The crazy ones 를 스티브 잡스 본인의 육성으로 녹음한 영상으로, 최종적으로는 방영되지 않은 버전이라는군요.


많이 회자되는 스탠포드 대학 졸업식 연설


스티브 잡스와 빌게이츠의 젊은 시절을 그린 영화, 실리콘밸리의 신화(원제 : Pirates Of Silicon Valley - 실리콘밸리의 해적 - )
스티브 잡스와 빌게이츠의 Apple, MS 설립 및 부흥기부터 잡스의 Apple 퇴출까지를 다루고 있습니다.
http://movie.daum.net/moviedetail/moviedetailMain.do?movieId=30849


젊은 스티브 잡스의 Macintosh 발표/데모 현장.
Macintosh 개발에 대한 이야기는 위의 실리콘밸리의 해적 영화에서도 비교적 자세히 다루어지며, 당시를 다룬 책으로 "미래를 만든 Geeks(http://www.yes24.com/24/goods/3794589)" 라는 책이 있습니다. 책에는 데모 준비에 대해서도 상세한 내용이 있죠.






이미 모아놓은 곳이 있군요 :)
http://ebizstory.com/681

2011년 10월 3일 월요일

Android package(APK) 파일 디컴파일 하기.

APK 를 압축프로그램으로 압축해제 하면, AndroidManifest.xml, assets, res 디렉토리와 classes.dex 파일이 나온다.
아래의 dex2jar 를 이용해 classes.dex 를 jar 로 변경 후, jar 파일을 압축 프로그램으로 압축 해제 하면 classes 파일이 나온다.
이걸 jad 로 디컴파일해 java 소스를 얻을 수 있다.

1. dex2jar
dex(dalvik executable) 포맷의 파일을 jar 포맷으로 변경해 주는 툴이다.

다운로드 : http://code.google.com/p/dex2jar/downloads/list
사용법 : # dex2jar <dex 파일 주소>
             ex) # dex2jar classes.dex
실행 위치에 jar 로 변경된 파일을 생성한다.


2. jad
classes 파일을 java 로 디컴파일 해준다.

다운로드 : http://www.softpedia.com/get/Programming/Debuggers-Decompilers-Dissasemblers/JAD.shtml
사용법 : # jad -o -sjava -r -d<target 경로> <디컴파일할 class 파일들 위치 경로>/**/*.class
             ex) # jad -o -sjava -r -ddecompiled src/**/*.class
<디컴파일할 class 파일들 위치 경로> 하위의 모든 class 파일들을 디컴파일해 <target 경로> 아래로 위치시킨다.


3. AXMLPrinter
APK 를 압축해제해 나온 xml 파일들은 binary 화 되어 있다. 이를 원래대로 되돌려준다.


다운로드 : http://code.google.com/p/android4me/downloads/list
사용법 : # java -jar <AXMLPrinter2.jar 경로> <decompile 할 xml 파일 위치>
             ex) # java -jar ../tools/AXMLPrinter2.jar AndroidManifest.xml
복원한 xml 파일을 화면에 출력해 준다. redirection(>) 등을 이용해 파일에 저장하면 되겠다.




참고 사이트 : http://hwangji.kr/sub/dev_leader/devstory/default.aspx?NHBBSID=NHBoardAppStory&NHBBSIDX=4


2011년 9월 21일 수요일

ConcurrentModificationException 은 multi thread 를 쓰지 않아도 나온다.

아래와 같은 java 코드에서 ConcurrentModificationException 이 발생한다.


ArrayList<A> objects = new ArrayList<A>;objects.add(new A(1)); 
objects.add(new A(2)); 
objects.add(new A(3)); 
objects.add(new A(4)); 

for(A object : objects) { 
    if (object.equals(A(1))) { 
        objects.remove(object); 
    } 
}


Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:782)
at java.util.ArrayList$Itr.next(ArrayList.java:754)
at HelloWorld.main(HelloWorld.java:12)

exception 이름을 보면 다중 thread 를 사용하거나 할 때 생길 법한데, 왜 나올까?

결론부터 말하자면, iterating 을 하는 와중에 remove() 를 했기 때문이다.

위와 같이 사용한 for 구문을 foreach 구문이라고도 하는데, foreach 구문은 내부적으로 iterator 를 사용한다. 때문에, 위의 for 문은,

for(Iterator iterator = objects.iterator(); iterator.hasNext();) { 
    A object = (A)iterator.next(); 
    ....

와 동일하다.
그런데, iterator 는 next() 또는 remove() 메소드가 호출될 때 현시점의 collection 수정 횟수와  생성 시점의 collection 수정 횟수를 비교해보고, 다르다면 ConcurrentModificationException 을 뱉는다.

문제는, ArrayList 의 remove() 메소드는 collection 수정 횟수를 하나 증가시킨다.
때문에, objects.remove() 가 수행된 다음 loop 의 iterator.next() 호출 시에, collection 수정 횟수가 맞지 않아 ConcurrentModificationException 이 발생한다.


결국, iterator 를 이용한 순회중 remove 를 할 것이라면 바로 break 를 해서 루프를 빠져나오거나, foreach 구문을 쓰지 않는 게 좋겠다.




참고 사이트 : http://suein1209.tistory.com/323

2011년 5월 24일 화요일

Android master branch 최근 소스 빌드 에러 : fatal error: GL/glx.h: No such file or directory

어제 AOSP 소스를 최신으로 땡겼더니 빌드 에러가 난다.


대략 다음과 같은 에러가 나는데...




fatal error: GL/glx.h: No such file or directory






libgl1-mesa-dev 패키지를 설치 하면 된다.




$ sudo apt-get install libgl1-mesa-dev






참고 사이트 : http://indiansmartphones.wordpress.com/2011/05/18/solution-to-fatal-error-glglx-h-no-such-file-or-directory/

2011년 5월 2일 월요일

우분투에서 firefox 4.0 설치하기


우분투에서는 소프트웨어를 자동으로 설치 할 수 있는 소프트웨어 저장소를 제공한다.
이 저장소를 이용하면 간편하게 안전하고 편리한 소프트웨어를 네트워크를 통해 설치하고 업데이트를 제공 받을 수 있지만, stable 하다는 검증이 되기 전의 소프트웨어는 올라오지 않기 때문에, 재빠른 최신 버전 소프트웨어를 즐기기에 어렵다.

이런 어려움을 위해 ppa(personal package achive) 라는 개념이 존재한다.
즉, 기존의, 우분투 팀에 의해 관리되는 저장소 외의, 개별적으로 사용 가능한 저장소이다.



우분투 시냅틱스 관리자에는 파이어폭스 4.0 이 아직도 올라오지 않았다.

기다리다가 오늘 드디어 파이어폭스 업데이트가 왔길래 설치했는데 이것도 4.0이 아니길래 분노, 다음의 방법으로 ppa 를 추가, 4.0 을 설치 했다.

시스템 > 관리 > 소프트웨어 소스 > 기타 소프트웨어 > 추가 > ppa:mozillateam/firefox-stable 입력 > 닫기


이제, ppa 가 추가 되었다.

업데이트 매니저에 이제 firefox 4.0 이 뜰 것이다. 설치해 주면 된다.

한글 입력 관련해서 좀 문제가 있는 것 같기도 하고...



참고 사이트 : http://opensea.egloos.com/5461418