드디어 전략으로 도미니언에서 승리!

도미니언(Dominion)은 리오그랑데게임즈 사에서 만든 유명한 보드게임이다. 카드로만 구성되어 있고 게임이 30분 전후로 끝난다. 초보부터 고수까지 재미있게 즐길 수 있는데, 게임 속에 운과 실력의 비율을 적당히 잘 섞은 아름다운 설계 덕분인 것 같다.

처음에 엄청 재미있을 것이라 생각해 올해 초에 ‘도미니언(오리지널)’과 ‘도미니언:장막 뒤의 사람들’을 동시에 구매했다. 그런데 최근까지 한 번도 못이겼다. 게임 소개에 따르면 전략을 잘 구사해야할 것 같지만 지금까지 3동(동,동동)으로 은을 구매하면서 시작하는 빅머니에 액션카드를 구매하는 전략들이 모두 깨졌기 때문이다. 그래서 지금까지 모든 게임이 금을 최대한 빨리 구매한 후에 속주 카드를 구매하는 단일화된 패턴으로 이루어졌고, 당연히 잘못 만든 게임이라는 생각에 거의 하지 않게 되었다.

그런데, 지난 일요일 오리지널 패키지의 크기왜곡을 통해 전략으로 첫 승을 거두었다! (야호!) 금, 은을 구매하지 않고 3 이하의 카드만으로 마녀만 4장정도 구매한 후에 상대편에는 저주를 계속 퍼붓고, 나는 카드 장수를 늘리면서 정원을 구매하는 전략이었다. ‘아 지금까지 제대로 하지 못했던 건가’ 하는 생각과 함께 열정이 살아나, ‘도미니언:암흑의 시대’를 구매해버리고 말았지만;;

참고로, 도미니언은 코리아보드게임즈에서 총 3개의 시리즈를 한글화 해놓고 있다. 영문은 훨씬 많은 패키지가 나와있지만 다른 사람과 즐기려면 아무래도 한글화 된 것이 좋다. 또 한글화 수준도 매우 준수해서 게임이 원활하다.

어서 확장판이 오면 다른 전략도 해봐야지.

20130923-125723.jpg

20130923-125807.jpg

20130923-125826.jpg

Robocode

Robocode는 아주 오랜 역사를 가진 자바 게임이다. 이미 제공되는 전쟁터 어플리케이션에 내가 만든 탱크만 넣으면 된다. 내 기억으로는 자바 언어가 만들어진 지 얼마 안되었을 때, multi-thread가 잘 되지 않는다는 세간의 의구심을 불식시키기 위해 만들어진 게임이었다. 지금은 자바 언어 입문자에게 게임을 통해 자바를 재미있게 배우도록 하는 기능과 전문가들이 자신만의 탱크를 자랑하는 게임으로 성장한 것 같다.

내 탱크는 사내 대회에 할당된 T/O를 채우기 위해, 주말에 만들어 월요일해야 한다는 말에 기존에 공개된 소스를 조합해 만든 것이라, 설명하기는 부끄럽다.  좀 잘해볼까 하는 마음도 있었지만, 포기 ㅠㅡㅠ

생각보다 탱크의 소스는 찾기가 어려웠다. 좋은 탱크들은 모두 꼭꼭 숨겨진 듯. 내 탱크는 샘플 소스를 조합해 만든 탱크이다.

다만, 히스토리를 남겨두었다가 다음에 업그레이드 하기위해 작성해 본다. 예선은 개최한 곳에서 자동으로 돌린다니 제출하고, 혹여나 예상치 못하게 본선에 진출하게되면 다시한번 탱크를 제출할 수 있다니 그 때 좀 자세히 봐야겠다.

Robocode Home : http://robocode.sourceforge.net/
my tank : JdBot_1.0.jar

어느 안드로이드 피싱 앱 구경하기

[서울지방법원]민사소송으로인한소환서가발부되었습니다 내용확인 <어떤 링크>

라는 문자가 오는 Sniffing 문자를 지인 홈페이지에서 발견, apk를 한번 열어보았다.

그 속에 요청하는 permission들은

  • android.permission.RECEIVE_SMS : 문자를 감시할 수 있다.
  • android.permission.INTERNET : 인터넷을 사용할 수 있다.
  • android.permission.ACCESS_NETWORK_STATE : 네트워크 상태를 확인할 수 있다.
  • android.permission.READ_PHONE_STATE : 핸드폰의 상태를 확인할 수 있다.
  • android.permission.RECEIVE_BOOT_COMPLETED : 시스템이 시작하는 이벤트를 받는다.
  • android.permission.RESTART_PACKAGES : 다른 application을 제어할 수 있다. (deprecated, lv 8)

그리고 다음과 같은 이벤트를 받으려 시도한다.

  •  com.example.myinterceptedshortmessage.receiver.InterceptedShortMessageReceiver : 아마도 내부적인 이벤트
  • android.provider.Telephony.SMS_RECEIVED : 문자가 오면 알고 싶다.
  • android.intent.action.BOOT_COMPLETED : 재부팅이 되면 알고 싶다.
  • android.net.conn.CONNECTIVITY_CHANGE : 네트워크의 상태가 바뀌면 알고 싶다.

시스템의 변화를 확인하면서 서비스를 띄운 후에, 문자를 감시하고 시스템 정보도 감시하는게 목적인 앱이다. Device Administration API 까지 사용하려고 시도하는 걸 보면, 핸드폰의 개인 정보를 최대한 빼가겠다는 이야기로 보인다.

Device Admin 권한이 무엇인지 모른다면, 아마도 필요없는 사람일 것이다. 그러니, 설치전에 Admin 권한을 요청하는 것은 조심하도록 하자.

어느 분이 MainActivity의 소스도 올려놓으신 듯;

그 밖에

MainActivity의 소스 코드는 http://pastebin.com/6iSRMMtv에서 볼 수 있다. 사이트 자체도 그리 건강해보이지 않으니 필요한 경우에만 url을 복사해서 들어가보도록 하자.

Context.MODE_MULTI_PROCESS

이전 글에서 Shared Preferences를 통해 데이터를 교환하는 것은 좋지 않다고 했지만, 써야할 때가 있다.  이 때 다른 app에서 값을 분명이 바뀌었는데 읽혀지지 않는 경우가 발생한다.  그렇다고 Shared Preference를 읽어오는데 실패하지도 않았고.

이 때는 아래와 같이

context.getSharedPreferences(__SHARED_PREFERENCES_NAME, Context.MODE_WORLD_READABLE | Context.MODE_MULTI_PROCESS);

MODE_MULTI_PROCESS를 넣도록하자. 이는 열려진 Shared Preference라도 수정사항이 발생하지 않았는지 읽어오기 전에 파일을 확인한다.

하지만, 역시 Shared Preferences를 통해 app간 데이터를 공유하지 않는 것이 제일 좋다. 다른 app에서 데이터를 읽을 수 있도록 도와주는 MODE_WORLD_READABLE, MODE_WORLD_WRITEABLE은 api level 17에서 deprecated 되었다.

내 Shared Preferences 파일은 어디에

Shared Preferences가 파일로 데이터를 저장하는 것이고, Android에서 이것을 쉽게 도와주는 것이라는 것은 모두 알 것이다.  그럼 어딘가에 저장되어 있다는 것인데, 이파일이 꼭꼭 숨겨져 있지 않고 찾기 쉬운 곳에 있다.

혹시 다른 app 간 통신에 Shared Preferences를 이용하고 있다면, 그 파일이 실제로 저장되었는지도 확인할 필요가 있다. 파일의 위치는 AndroidManifest.xml에 적힌 package 이름에 영향을 받는다.

/data/data/[YOUR_PACKAGE_NAME]/shared_prefs/[YOUR_PACKAGE_NAME]_preferences.xml

Default가 아닌 Preferences들도 같은 폴더에 저장되어 있다. 이에 대한 스택오버플로우에 올라온 좋은 답은 여기에!

하지만, Android에서는 World Readable로 선언된 Preferences 사용을 권장하지 않는다. 이유는, 어떤 app이나 접근할 수 있고 위에 말한 것처럼 파일의 위치도 노출되어 있기 때문이다. Preferences를 통해 데이터를 공유하는 경우에는, 모든 app에서 읽어가도 무방한 것만 공유하자.

아니라면, Intent, AIDL등의 방법을 사용하는 것이 옳다.

참고로 꼭 써야한다면? Lint를 이용한 검증 때, 잡히지 않도록 @SuppressLint(“WorldReadableFiles”) 를 method나 class에 붙여주면 warning을 보지 않을 수 있다.