반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리


반응형

'세상을 살면서 도리에 어긋나지 않아 편안한 마음을 가질 수 있다면 그것으로 충분하다'

인생재세지구심안리득취호료 (人生在世只求心安理得就好了).


박근혜 대통령이 중국 기자와의 인터뷰에서 한 말이고 메모지에도 적어 줬다는 그 글귀입니다.


정말 좋은 말입니다.


그리고 이런 좋은 말을 가슴에 담고 있다면 그 사람은 충분히 정신세계에 관심이 있는 사람입니다.

그리고 도가 무엇인지 진리가 무엇인지에 대해서도 궁금해 하는 사람입니다.


이 글을 보고 감동 받아서 그날 제 페이스북에도 글을 올렸었습니다.


그리고 진심으로 이 가르침대로 살려고 노력하는 대통령이 되시길 빌었습니다.



오늘 인터넷으로 한겨레 신문을 보다가 이런 글귀를 발견했습니다.

"인생재세지구심안리득취호료

  (-세상을 살면서 도리에 어긋나지 않아- 편안한 마음을 가질 수 있다면 그것으로 충분하다)" 
  박근혜 대통령이 중국방문을 앞두고 CCTV와 가진 인터뷰에서 한 말입니다. 
  참 좋은 말인데요. 참고로 이명박 전 대통령의 가훈은 '정직'입니다.





이런..


명박이네 가훈이 정직이라네요.


오랜만에 빵 터지는 유머네요.


이 정직은 正直 일까요 停職 일까요?


박근혜가 말하는 도의 이치 (道理) 도 이렇게 우리를 헛갈리게 하지 않았으면 좋겠습니다.


'세상을 살면서 도리에 어긋나지 않아 편안한 마음을 가질 수 있다면 그것으로 충분하다'


이 좋은 말이 감동을 주는데 사용 되야지 한낱 유머에 사용되면 안되지 않겠습니까?




반응형


반응형

야후 뉴스에 보도된 전두환 비자금 관련 기사입니다.

영어 공부도 할겸 번역해 봤어요.


SKorea hunts for ex-dictator's slush money: $143M

 

 

 

 


반응형


반응형

 

이곳 미국 샌디에고에서 국정원 불법선거 규탄 시위가 있었습니다.

용감한 두 여성분들이 피켓 시위를 하셨는데요.

이곳 시간으로 6월 22일 오후 2시부터 1시간 가량 진행하신것 같더라구요.

 

 

민주주의를 지탱하는 가장 핵심적인 이벤트인 선거.. .그것도 대통령 중심제인 우리나라에서 대통령선거를 국가 최고의 정보기관인 국정원을 동원해서 불법선거를 자행하고 또 최고 권력기관중 하나인 경찰이 그 불법을 무마하고 증거를 인멸한 행위는 용서받을 수 없는 범죄 행위입니다.

 

이런 범죄 행위를 명명 백백하게 밝히도록 해서 절대 재발 하지 않도록 하는 것이 대통령의 역할인데 박근혜는 오히려 국정원과 경찰의 민주주의 근간을 흔드는 불법행위에 대해 침묵으로 일관하고 더 나아가 전직 대통령의 정상회담 발언록까지 공개토록하는 말도 안되는 짓을 저지르면서 국민을 호도하려고 하고 있습니다.

 

예전에 글에서도 밝혔듯이 친일파의 딸 그리고 구테타로 정권을 잡고 민주를 짓밟은 독재자의 딸 박근혜에게 기대하는건 없었습니다. 역시나 아버지 따라서 민주를 짓밟는 이런 만행을 저지르고야 마는 군요.

 

이곳 먼 미국 그것도 캘리포니아 남단에 있는 샌디에고(San Diego) 에서도 조국의 현실에 가슴아파하고 조금이라도 힘을 보태서 잘못되지 않도록 바로 잡고 싶어하는 분들이 많이 있습니다.

 

피로 찾은 민주주의 다시 후퇴시킬 수 없습니다. 더군다나 독재자 박정희의 딸로 인해서 다시 후퇴하도록 할 수 없습니다.

 

한국에서도 많은 움직임이 있던데 힘껏 국민의 의무를 다 합시다.

 

 

반응형

Mockito로 테스트 하기

2013. 6. 17. 08:06 | Posted by 솔웅


반응형

오늘은 Lars Vogel 라는 친구가 작성한 Mockito 튜토리얼을 공부했습니다. 2012년 6월에 작성해서 2013는 2월에 Revision 됐으니까 아주 최근 글이네요. Mockito 에 대한 기본 설명과 예제가 있고 예제는 안드로이드 프로젝트에서 사용할 때의 예제를 보여 줍니다.

글 제목을 클릭하시면 원본이 있는 페이지로 가실 수 있습니다. 고맙게 자신이 어렵게 얻은 지식을 이렇게 공유해 주고 있는 친구에게 도움을 주는게 기본 예의 아닐까 합니다. 해당 페이지에는 Donation 할 수 있는 링크도 있고 광고도 있으니까 이 중 할 수 있는 방법으로 도움을 주실 수 있을 거예요. :)

 

Testing with Mockito - Tutorial

Lars Vogel

 

 


Version 1.1

02.05.2013


Testing with Mockito

이 튜토리얼은 이클립스에서 모키토 프레임워크로 테스트 하는 방법을 설명하고 있습니다.


 


1. Prerequisites

아래 튜토리얼은 JUnit 프레임워크로 단위테스트하는 것을 기반으로 작성했습니다.

JUnit 를 잘 모르신다면 JUnit Tutorial 를 참조하세요.

 


2. Testing with mock objects


Unit testing은 클래스나 메소드별로 별도로 테스팅하는 것을 말합니다.


자바 클래스들은 대개 다른 클래스들에 의존 합니다. mock object는 특정 메소드 호출에 어떤 output을 정의한 인터페이스나 클래스에 대한 dummy implementation을 말합니다. Mock object들은 dependency 없이 테스트 되어야 하는 클래스에 대한 단위테스트를 만들 때 유용하게 사용됩니다.


코드를 작성해서 이 mock object들을 생성하거나 이 클래스들을 simulate 하기 위해 mock framework을 사용할 수 있습니다. Mock frameworks는 runtime에 mock object들을 생성할 수 있도록 하고 그 behavior를 정의할 수 있도록 해 줍니다.

mock object에 대한 고전적인 예제는 data provider를 들 수 있습니다.  production에서는 실제 데이터베이스가 사용되지만 테스팅에서는 mock object를 사용해서 데이터베이스를 simulate 해야 합니다. 실제 데이터베이스를 사용할 때와 똑같은 상황을 만들어 놓고 테스트를 해야 되는 거죠.

이 mock object들은 테스트 될 클래스에 제공될 수 있습니다. 그래서 테스트 해야할 클래스가 외부 데이터에 대한 의존(dependency) 없이 동작하고 그 결과를 테스트 할 수 있습니다.

Mock frameworks는 또한 mock object 와의 상호작용(interaction)을 가능하게 해 그에 따른 테스트를 진행할 수 있도록 합니다. 예를 들어 mock object에 의해 call 된 메소드를 테스트를 하는 경우가 이 경우가 되겠죠.


 


3. Mockito


3.1. The Mockito testframework

Mockito 프레임워크에 대해서는 Mockito homepage 에 가시면 자세한 내용을 보실 수 있습니다.

Mockito 는 여러분에게 항상 mock objects를 생성할 수 있도록 기능을 제공합니다. 이 mock objects들은 method를 호출할 때 Pass 되도록 할 수 있어 그 메소드를 테스트 할 수 있도록 도와 줍니다.

 

3.2. Using Mockito

Mockitomock() 메소드를 call 해서 생성하거나 @Mock annotation에 근거해서 생성할 수 있습니다. annotation이 사용됐다면 MockitoAnnotations.initMocks(this) method call을 사용해서 초기화 해야 합니다.

아래의 예제를 보세요.

 

public static Intent createQuery(Context context, String query, String value) {
    Intent i = new Intent(context, MyListActivity.class);
    i.putExtra("QUERY", query);
    i.putExtra("VALUE", value);
    return i;
  } 

 

이 메소드는 Context 에 대해 mock object를 만들어서 테스트 할 수 있습니다.

 

package com.vogella.android.mockito.intent.test;

import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.test.AndroidTestCase;

import com.vogella.android.mockito.intent.MainActivity;

public class MainActivtityTest extends AndroidTestCase {
  @Mock
  Context context;

  @Override
  protected void setUp() throws Exception {
    MockitoAnnotations.initMocks(this);
  }

  public void testQuery() throws Exception {
    Intent intent = MainActivity.createQuery(context, "query", "value");
    assertNotNull(intent);
    Bundle extras = intent.getExtras();
    assertNotNull(extras);
    assertEquals("query", extras.getString("QUERY"));
    assertEquals("value", extras.getString("VALUE"));
  }
} 

Note

이 예제 코드는 단지 간단한 사용법을 보여 드리기 위한 겁니다. 이 예제는 안드로이드 프로그래밍을 예로 들었습니다. Android 에서 Mockito를 direct 하게 사용할 수 있습니다.

Tip

Static imports allows you to call static members, i.e. methods and fields of a class directly without specifying the class. If you declare Mockito.* as static member you can access methods like mock() directly.

 

 

Mockito 에는 아주 훌륭한 API 가 있습니다. verify() method 를 사용해서 해당 메소드가 호출 됐는지 여부를 확인 할 수 있습니다.

when(....)thenReturn(....) 를 사용하면 특정 상황에서의 return 값을 정해 줄 수 있습니다.

doReturn(object).when(kdskfsk).methodCall 도 비슷한 일을 합니다.

특정 상황을 체크하기 위해 mock object에 verify() method 를 사용해도 됩니다.

@Spy 나 spy() method 는 real object를 wrap 하기 위해 사용할 수 있습니다. Every call, unless specified otherwise is delegated to the object.

 

// Lets mock a LinkedList
List list = new LinkedList();
List spy = spy(list);

//You have to use doReturn() for stubbing
doReturn("foo").when(spy).get(0);

// this would not work
// real method is called so spy.get(0)
// throws IndexOutOfBoundsException (list is still empty)
when(spy.get(0)).thenReturn("foo");

 

verifyNoMoreInteractions()는 더이상의 메소드 호출이 없음을 체크할 수 있도록 합니다.

 


4. Mockito on Android

release 1.9.5 Mockito 부터 Android 에서 direct로 사용할 수 있도록 됐습니다. 안드로이드 테스트 프로젝트에서 Mockito를 사용하려면 안드로이드 테스트 프로젝트의 libs 폴더에 아래 세개의 라이브러리를 추가 하시면 됩니다.

https://mockito.googlecode.com/files/mockito-all-1.9.5.jar
http://dexmaker.googlecode.com/files/dexmaker-1.0.jar
http://dexmaker.googlecode.com/files/dexmaker-mockito-1.0.jar 


 

5. Thank you

이 글이 괜찮으시다면 도움을 주세요.

여기 로 가시면 도움을 주실 수 있는 방법이 있습니다.


6. Questions and Discussion

질문을 올리시기 전에vogella FAQ 를 먼저 보시면 도움이 되실 겁니다. 이 글을 보시고 질문이 있으시거나 에러를 발견하셨다면 www.vogella.com Google Group를 이용해 주세요. how to create good questions 도 만들었습니다. 이 글을 보시면 여로분께 도움이 되실 겁니다.

 

7. Links and Literature  

7.1. EasyMock

EasyMock Homepage



반응형


반응형
 Tiffani - Brad Pitt Interview 영상
 

 

오늘 이 인터뷰 동영상이 떴길래 한번 받아 쓰기 해 봤어요.


Tiffany : How did you build to ... be able to .. take control of whole production and be a part of that at the same time

 

Brad Pitt : a want to just more responsibility but the you know I am really really thrill of with the with the finish film and people have so much fun with it ..

 

Tiffany : And is there any specific reason you want to take on this whold of the picture

 

Brad Pitt : My boys My boys love this kind of film so that's why I've got started. and I can carry out way from there


Tiffany : It is Actually be most highly anticipated film .. in this summer.. all around the world

 

 


Tiffany : Now we are a couple of hours away from your red carpet event for this movie in Korea.
  Anything you looking for it to...

 

Brad Pitt : Well I just want to say that I am great to be here. It's really so much.. so nice . It is just looking for people to see it because it is so much fun.. i mean .. it is just begins begins very quickly and then it's just doesn't let up to the temporaly(?) control..

 

Tiffany : There is one word that I'd like to teach you so you can say to all of your korean fans. It's call 대박.  you use that one like you want to say something like really cool it would like .. Could you tell to camera and all of your Korean fans. All of your voyage 대박.

 

 

암만 들어도 뭐라고 말하는지 감이 안 잡히는 단어가 몇개 있더라구요.

미국에서 살지만 수십년간 한국말만 쓰다가 와서 영어 사용이 힘들긴 합니다.

한국말은 회의 시간에 딴 짓 하면서 들어도 뭔 얘기인지 다 알아 듣지만 여기선 회의 할 때 정신 바짝 차리지 않으면 뭔 말 하는지 모르고 그냥 지나 가요...

 

그래서 회의 한번 하고 나오면 진이 빠지죠.

 

한국에서는 일하는데 에너지를 다 쏟으면 되지만 여기는 의사소통하는데에도 많은 에너지를 쏟아야 되서 확실히 한국에서 일하는 것 보다 더 힘든거 같아요.

 

Anyway... 혹시 저기 물음표로 표시한 단어가 확실하지 않은데..  뭐라고 말 했는지 아시는 분들은 좀 알려 주세요.

저건 아무리 들어도 잘 모르겠더라구요.

 

 

반응형


반응형

오랜만에 코로나 튜토리얼을 번역해 봅니다.

거르지 않고 꼬박꼬박 해 오다가 이번 TDD 프로젝트에 참여하면서 두달넘게 공부를 하지 못했네요.

오랫동안 모바일 앱을 만들지 못했는데... 이제 모바일 앱 하나 만들고 싶습니다.

 

----------------------------------------------------

 

Posted on . Written by

 

지난주의 "Goodbye Globals!" 튜토리얼에 이어서 오늘은 non-global 메소드 안에서 scene들 사이에서 오디오 파일들을 어떻게 관리할지에 대해 얘기 나누도록 하겠습니다. 대부분의 앱에서 특정 오디오 파일들은 전체 앱내에서 필요로 하는 경우들이 많습니다. 그리고 어떤 오디오 파일은 특정 scene 에서만 필요로 하는 경우도 있구요. 특정 scene에서 오디오 파일이 로드 돼서 다른 scene 에서도 overlap 되는 상황도 필요할 때가 있습니다. 이런 경우 scene 내의 객체들을 cleanup 하는 것과 별도로 오디오 파일을 관리해야 해서 좀 복잡하게 됩니다.

 

이런 경우 어떻게 관리 해야 할까요? main.lua 에서 common sound를 로드하고 그 사운드들에 global 로 처리하도록 할 겁니다. 그러면 어떤 scene 에서도 해당 사운드를 플레이 할 수 있죠. 그런데 왠만하면 이 global 한 객체들을 사용하지 않는게 좋습니다. 그리고 실제로는 글로벌이 아니면서 여러분만의 global space를 생성하는 방법을 알려 드린 지난주 튜토리얼을 이런 경우에도 활용할 수 있습니다.

 

 

 

Creating the “sfx.lua” Module

 

첫번째로 할 일은 오디오를 처리할 모둘 이름을 sfx.lua 로 해서 만듭니다. 처음 시작하는 몇 라인은 아주 기본적인 겁니다. 약간의 세팅과 데이터가 들어있는 myData.lua 모듈을 사용합니다. 이 내용은 지난주에 자세히 다뤘었습니다. 그리고 나서 변수들을 담을 namespace를 생성합니다. 

 

local myData = require( "mydata" )
local sfx = {}  --create the main Sound Effects (sfx) table.
return sfx

 

루아의 required 는 처음에 한번만 실행된다는 것을 기억해 두세요. 처음 시작할 때 어떤 세팅이나 configure를 core code 에서 할 수 있다는 얘기입니다.

 

예를 들어

 

sfx.boomSound = audio.loadSound( "audio/explosion2.wav" )
sfx.bigBoomSound = audio.loadSound( "audio/explosion.wav" )
sfx.killMeSound = audio.loadSound( "audio/idied.wav" )
sfx.missileSound = audio.loadSound( "audio/missile.wav" )
sfx.blasterSound = audio.loadSound( "audio/scifi048.wav" )
sfx.bossSound = audio.loadSound( "audio/scifi026.wav" )
sfx.shieldsSound = audio.loadSound( "audio/shields.wav" )


이제 간단하게 sound에 대해 처리 하는 부분을 만들겁니다. 그리고 오디오 API 에게 각각의 사운드를 로드하도록 합니다. 그리고 그 handle 을 sfx 테이블에 저장합니다. 루아에서는 이 테이블을 dot 이나 bracket syntax로 구현할 수 있도록 제공합니다. sfx.boomSound 나 sfx["boomSound"] 이렇게 두가지 방법으로 처리할 수 있습니다. 이렇게 하면 나중에 sound를 참조할 handle name을 사용할 수 있습니다. 예를 들어 어떤 scene에서 sfx.lua 가 필요하면 아래와 같이 해당 오디오 파일을 플레이 시키면 됩니다.

 

audio.play( sfx.boomSound )

 

더 나아가서 이 메소드를 extend 해서 추가적인 기능을 부여할 수도 있습니다. 아래와 같이 추가적으로 오디오 파라미터들을 셋업 할 수 있는거죠.

 

audio.reserveChannels( 5 )
masterVolume = audio.getVolume()
audio.setVolume( 0.80, { channel = 1 } )  --music track
audio.setVolume( 0.66, { channel = 2 } )  --boss sound
audio.setVolume( 1.0,  { channel = 3 } )  --voice overs
audio.setVolume( 1.0,  { channel = 4 } )  --alien voice
audio.setVolume( 0.25, { channel = 5 } )  --weak explosion

 

sfx 테이블에서 call 할 수 있는 init 함수를 간단히 생성할 수 있습니다.

 

sfx.init = function()
   audio.reserveChannels(5)
   sfx.masterVolume = audio.getVolume()  --print( "volume "..masterVolume )
   audio.setVolume( 0.80, { channel = 1 } )  --music track
   audio.setVolume( 0.66, { channel = 2 } )  --boss sound
   audio.setVolume( 1.0,  { channel = 3 } )  --voice overs
   audio.setVolume( 1.0,  { channel = 4 } )  --alien voice
   audio.setVolume( 0.25, { channel = 5 } )  --weak explosion
end

 

이제 masterVolume sfx 테이블에 저장됐습니다. 그리고 나중에 이런 다른 action들이 필요 하면 그에 맞는 액션을 사용할 수 있습니다.
그리고 다른 trick으로는 여러분 앱의 sound on/off 세팅을 담당할 audio.play 의 버전을 만들 수 있다는 겁니다. 예를 들어 아래와 같이 필요한 사운드를 필요할 때 사용할 수 있습니다.

 

if ( settings.soundOn ) then
   audio.play( "beep" )
end

 

sfx.play 라는 함수를 생성해서 audio.play 와 비슷하게 작동하도록 할 수 있습니다. 이  방법을 사용하면 sound setting을 좀 더 편하게 할 수 있습니다.

 

sfx.play = function( handle, options )

   if ( myData.settings and myData.settings.soundOn == false ) then
      --your settings dictate NOT to play this sound
      return false
   end

   --otherwise, one of three things is true:
   --1. myData.settings is nil. You haven't set up control, so play the sound.
   --2. myData.settings.soundOn is nil. You have settings, but not a soundOn flag.
   --   So, play the sound since you haven't set up control.
   --3. soundOn is true, which means you want to play the sound. So, play it!
   audio.play( handle, options )

end

Loading Scene-Specific Sounds

Storyboard 와 함께 오디오를 사용할 때 만날 수 있는 어려움들에는 아래와 같은 것들이 있습니다.


• 해당 scene의 main chunk에서 사운드를 로딩하면 문제가 발생할 수 있습니다.왜냐하면 reload를 하려면 scene을 remove 한 다음에 recreate을 시켜야 하기 때문이죠.


createScene 이벤트는 scene이 로드될 때마다 로드될 필요가 없습니다. 그리고 큰 사운드가 로드되면 transition이 delay 되게 될 겁니다.


enterScene 이벤트는 매번 fire 됩니다. 하지만 스크린에 해당 scene이 완전히 로드되기 이전에는 사운드가 로드되지 않는다는 특징이 있습니다.

 

위의 enterSceneexitScene은 한 쌍으로 발생됩니다. enterScene은 scene-specific sound를 로드할 최적의 장소일 것입니다. 그리고 나서 exitScene 이벤트에서 audio.dispose()를 사용해서 그것들을 처리하면 됩니다. (이 때 객체를 nil 처리하는 것을 잊지 마세요.)

 

그런데 만약에 앱이 새로운 scene으로 갈 때 sound 가 갑자기 끊기지 않고 계속 play 되어야 하는 상황이면 어떨까요? 다음 scene에서는 이 audio handle에 접근할 수 있는 방법이 더 이상 없습니다. 이 문제점을 해결 하려면 sfx테이블로 sound 를 로딩하시면 됩니다. 그리고 onComplete phase에서 anonymous 함수를 사용해서 dispose 시키면 됩니다.

 

아래 코드를 보세요.

 

local sfx = require( "sfx" )

-- forward declare the handle
sfx.longsound = nil

function scene:createScene( event )
   local group = self.view

   local background = display.newRect( 0, 0, display.contentWidth, display.contentHeight )
   background.x = display.contentCenterX
   background.y = display.contentCenterY
   group:insert( background )

   local function leaveScene(event)
      if ( event.phase == "ended" ) then
         storyboard.gotoScene( "b" )
      end
   end

   local button = display.newRect( 100,100,100,100 )
   group:insert( button )
   button:setFillColor( 255,0,255 )
   button:addEventListener( "touch", leaveScene )

end

function scene:enterScene( event )
    sfx.longsound = audio.loadSound("audio/mirv_missiles_online.wav")
audio.play( sfx.longsound, { onComplete = function()
                                      audio.dispose( sfx.longsound )
                                      end } )

 

end 

 

루아에서는 onComplete 이벤트가 call 할 수 있는 anonymous 함수를 사용할 수 있도록 제공합니다. 여러분은 이 메소드를 오디오 파일이 끝났을 때 dispose 하도록 할 때 사용하실 수 있습니다. sound 가 실제로 사용되기 전에 sfx table에서 sound handle 하도록 미리 선언해둬야 한다는 것을 잊지 마세요.

 

여러분은 모듈에서 오디오를 처리하는 것의 장점을 아실 겁니다. 특히 Storyboard나 다른 scene manager utility를 사용할 때 말이죠. 오디오는 조심스럽게 그리고 제대로 관리 되어야 한다는 사실을 명심 하셔야 합니다. 물론 그 오디오 파일을 dispose 시키는 것도 말이죠. 그렇게 함으로서 메모리 누수를 방지하고 다른 이상한 문제점들을 방지할 수 있습니다.

 

반응형

‘전두환 사전’ 조력자 명단

2013. 6. 10. 10:42 | Posted by 솔웅


반응형

한겨레신문이 독재자 전두환의 숨은 재산을 찾아 추징금 공소시효 만료를 막으려고 노력하고 있군요.

 

엑셀 파일 형태로 여러 명단도 제공을 하고 있는데요.

 

1. 비자금 형성 관리 과정의 조력자 명단

2. 전두환 일가 명단

3. 전두환 일가 재산 목록

4. 기사로 보도된 전두환이 골프 친 골프장 목록

 

등등이 있습니다.

 

관련 엑셀 자료는 여기(c.hani.co.kr/facebook/2139505) 에 가시면 받아 보실 수 있습니다.

 

그리고 시민들의 도움을 요청하고 있군요.

 

‘전두환 사전’ 조력자 명단 주목을

시간이 없습니다. 전두환 전 대통령이 내지 않은 추징금 1672억원이 올해 10월 추징시효가 만료됩니다. 5월20일부터 독자·시민과 함께 전두환 전 대통령의 숨은 재산을 찾으려는 ‘크라우드소싱’(crowdsourcing)을 진행중인 <한겨레>는 누리집에 ‘잊지 말자 전두환 사전 1.0’(c.hani.co.kr/facebook/2139505)을 공개하고 있습니다. 시민들이 이 정보를 분석하고, 추가 내용을 제보하며, 취재 방향에 의견을 제시하면 다시 <한겨레>가 탐사에 나섭니다. 무엇보다 ‘조력자 명단’에 주목해 주십시오. 지금까지 60여건의 ‘신뢰할 만한 제보’가 들어와 탐사취재를 하고 있습니다. 이런 집단지성의 결과를 정리해 6월 중순께 ‘잊지 말자 전두환 사전’ 버전 1.2를 공개할 예정입니다. 집단협업은 추징시효가 만료되는 올해 10월까지 계속됩니다.

 

 

 

나도 힘을 보태서 학살 원흉 독재자 반란수괴 전두환을 처벌하는데 일조를 하고 싶은데...

무엇을 할 수 있을지 생각이 안 나네요.

 

혹시 위 링크에 있는 엑셀 파일에 추가될 수 있는 정보가 있으신 분들은 한겨레신문에 제보해 주세요.

 

전두환 전 대통령의 숨은 재산을 찾습니다

2013년은 아직 정의가 배고픕니다. 전두환 전 대통령이 내지 않은 추징금 1672억원이 올해 10월 추징시효가 만료됩니다. <한겨레>가 전 전 대통령의 숨은 재산을 찾는 탐사에 나섭니다.

과거와 다른 점이 있습니다. 독자와 시민들께 말 거는 한겨레가 되려 합니다. ‘크라우드 소싱’(crowdsourcing)을 제안합니다. 언론사나 기관이 직접 처리하기 어려운 방대한 로데이타를 웹에 공개합니다. 독자들이 마음껏 다운로드 받습니다. 시민들이 이 정보를 분석하고, 추가 내용을 제보하며, 취재 방향에 의견을 제시합니다. 다시 <한겨레>가 탐사에 나섭니다. 인터넷상의 집단 협업입니다. 지금 여기 ‘잊지말자 전두환 사전 1.0’을 공개합니다.

▶잊지말자 전두환 사전 1.0 받기

이 파일에는 ‘전두환 친인척 명단’‘전두환 비자금 조성 및 관리 조력자 명단’‘전두환 일가 재산 목록’‘전두환 골프장 리스트’ 등 네 종류의 정보가 들어있습니다. 독자와 시민들께 각각의 정보에 대해 설명드립니다.

첫째, ‘전 전 대통령 비자금 형성 및 관리 조력자’ 명단입니다. 2004년 전재용씨가 조세포탈 혐의로 유죄 판결 받았습니다. 이 과정에서 전 전 대통령 비자금 채권이 대거 발견되었습니다. 1996년 검찰 수사 때도 차명계좌가 여럿 발견되었습니다. 두번의 검찰 수사에서 전 전 대통령은 수십명의 명의를 빌려 차명계좌를 만들어 비자금을 관리하고 있음이 드러났습니다.
비교적 최근인 2004년 검찰 수사에서 명의수탁자로 입증된 사람, 1996년 내란·뇌물죄 수사 당시 검찰 수사 발표 및 관련 보도에서 명의수탁자로 거론된 사람을 중심으로 ‘전두환 비자금 조력자’명단을 추렸습니다. 과거 공직에 몸 담았는지 등을 면밀히 살펴 보도의 공익성을 고민했습니다.
이들 조력자들이 전 전 대통령 비자금의 비밀을 많이 알고 있을 것으로 추측합니다. 독자들께서는 이들에 대해 알고있는 정보를 제공해주십시오.

둘째 ‘전 전 대통령 친인척 명단’을 제공합니다. 1980년부터 2013년 현재까지 <한겨레>를 비롯한 전국종합일간지에 한번 이상 보도된 명단입니다.
이렇게 파악한 50여명의 친인척 가운데, ‘전 전 대통령 직계가족’‘1988년 국회 5공비리특별위원회의 조사대상’‘1996년 전 전 대통령 내란·뇌물죄 검찰 수사 대상자’‘2004년 전재용씨 조세포탈 검찰 수사 및 유죄 판결’ 및 관련 보도 등에 여러차례 거론되는 사람을 추려 공개합니다. 대부분 직접 비리에 연루되었거나, 전 전 대통령이 차명계좌를 만들도록 명의를 빌려준 분들입니다. 비자금과 무관한 단순 친인척은 공개하지 않습니다.
지금 공개하는 친인척들이 전 전 대통령 숨은 재산의 비밀을 어느정도 알고 있을 것으로 <한겨레>는 추측합니다. 독자들께서는 이들에 대해 알고있는 정보를 제공해주십시오.

셋째, 전 전 대통령 일가 재산 목록입니다. 1980년 이후 지금까지 언론에 한번 이상 보도된 재산입니다. 사생활 침해의 우려를 무릅쓰고 재차 공개합니다. 지난해 <한겨레21>은 5공화국 핵심 비리 땅이 전 전 대통령의 처남을 거쳐 딸 효선씨에게 뒤늦게 증여된 사실을 밝혀냈습니다. 2004년 수사와 재판에서 전재용씨 소유 채권이 대부분 전 전 대통령 비자금이었음이 입증되었습니다.
이처럼 전 전 대통령 직계 가족들의 재산은 전 전 대통령 부부의 차명재산일 가능성이 농후합니다. 독자들께서는 이와 관련해 알고있는 정보를 제공해주십시오.

넷째, 전 전 대통령이 다니는 골프장 명단입니다. 1980년 이후 지금까지 전 전 대통령이 한번 이상 라운딩한 것으로 보도된 골프장입니다. 라운딩을 목격할 경우 곧바로 제보 부탁드립니다. 명예훼손 여부를 무릅쓰고 공개합니다.
전 전 대통령은 재산이 없다며 추징금을 내지 않고 있습니다. 그런 전 전 대통령이 고급 골프장에서 라운딩하는 것은 본인의 주장과 맞지않습니다. <한겨레>가 골프 비용을 누가 냈는지 취재하려합니다.


제보받을 이메일 : 고나무 기자 dokko@hani.co.kr
트위터 @dokko518

<한겨레>가 독자들께 처음 크라우드 소싱을 제안한 5월20일부터 26일까지, 전자우편을 통한 제보 45건 등 전자우편·SNS 등을 통해 모두 50여건의 ‘신뢰할만한 제보’를 받았습니다. 독자와 시민들께 감사드립니다. 이 제보와 참여를 바탕으로 <한겨레>가 취재하여 ‘잊지말자 전두환 사전 버전 1.2’를 곧 공개하겠습니다. 집단협업은 올 10월까지 계속됩니다.

반응형

jUnit 으로 Private Method 테스트 만들기 2

2013. 6. 10. 10:04 | Posted by 솔웅


반응형

지난번 글에 jUnit으로 Private Method 만들기를 올렸는데요.

 

input 파라미터가 class가 아니라 type 일 때 좀 헛갈려 하는 친구가 있더라구요.

 

기본 데이터 타입을 다룰 때는 class 대신 TYPE을 사용하시면 됩니다.

 

Integer 를 예로 들어서 실습을 해 볼께요.

 

    private int jUnitPrivate2(int a, int b) {
        int result = 0;
        result = a + b;
        return result;
    }

 

테스트 할 원래 코드는 위와 같습니다.

 

지난번 글에서 String 대신 Integer를 파라미터로 사용하시면 됩니다.

이에 대한 테스트 코드는 아래와 같습니다.

 

   @Test
    public void testJunitPrivate2() {
       
        Method m;   
        Class[] methodParameters = new Class[]{Integer.TYPE, Integer.TYPE};

        try
        {
            m = jPrivate.getClass().getDeclaredMethod("jUnitPrivate2",methodParameters);
            m.setAccessible(true);
           
            int result =0;
            int a = 111;
            int b = 222;
               
            try
            {
                result = (Integer) m.invoke(jPrivate,a,b);
            }
            catch (Exception e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
                       
            assertEquals(333,result);
        }
        catch (Exception e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

 

 

String.class 대신 Integer.TYPE 이 들어갔습니다.

다른 건 없습니다.

 

 

 

지난번 테스트 소스에 추가를 했습니다.

보시다시피 지난번 jUnit test 하고 이번에 Integer 를 사용한 private class 를 테스트한 jUnit test 하고 모두 통과 됐습니다.

 

privatemethod.java

 

jUnitPrivateTest.java

반응형

jUnit 으로 Private Method 테스트 만들기

2013. 6. 10. 08:05 | Posted by 솔웅


반응형

TDD 프로젝트에 join 한지 두달이 넘어갑니다.
이제 Spring Framwork 에서 JUnit 테스트 만드는 일은 제법 익숙해 졌어요.

오늘은 Private 메소드에 대한 JUnit 테스트 만드는 방법을 정리해 두어야 겠습니다.

우선 Method 메소드를 만들어서 테스트할 private 메소드를 담을 겁니다.


Method m = singlePaymentController.getClass().getDeclaredMethod("method name",input parameter -class-);

singlePaymentController 는 테스트할 클래스 이름인데요.


미리 인스턴스를 생성해 놓은 변수 입니다. (SinglePaymentController singlePaymentController = new SinglePaymentController(); 이렇게요.

 

그 클래스에서 getClass()를 안의 getDeclaredMethod() 를 불러 냅니다.
private 메소드를 외부에서 접근할 때는 이 getDeclaredMethod()를 사용하고 private field 에 접근할 때는 getDeclaredField() 나 getDeclaredFields를 사용합니다.


이 밖에서getDeclaredConstructor(), getDeclaredClass() 등 여러가지가 있습니다. 필요할 때 사용하면 됩니다.

 

getDeclaredMethod() 안에 들어가는 인자들은 해당 메소드 이름이 string으로 들어가고 그 다음엔 그 메소드의 input parameter 들을 열거하면 됩니다.

 

그러면 테스트 하고 싶은 private 메소드를 Method 객체 안에 담을 수가 있습니다.

m.setAccessible(true);

 

이제 위 코드 처럼 해당 private 메소드를 접근할 수 있도록 합니다.
이제 외부에서 그 private 메소드에 접근 할 수 있습니다.

 

이제 해당 private method 를 실행시키면 됩니다.


invoke 메소드를 사용하는데요.


그 private method를 담은 Method 객체를 invoke 해 주면 됩니다.
m.invoke() 이렇게요.

 

여기서 invoke 안에는 그 private 메소드가 들어있는 class와 private method 에 전달 될 input parameter 를 넣어 주면 됩니다.

 

private 메소드가 들어있는 클래스는 아까 사용했던 singlePaymentController 가 되겠네요.
그리고 그 private method의 input parameter는 새로 생성해서 테스트 데이터를 넣어 주셔야 됩니다.

 

input parameter 에 필요한 값들 넣기

m.invoke(클래스 이름, input parameter)

 

assert 하기

이렇게해서 해당 private method 안에서 처리되어야 할 값들을 assert 문에 넣어서 예상값과 실제 처리된 값을 비교하면 되겠죠.

 

만약 그 private 메소드가 return 값이 있다면 invoke 해서 return 되는 값을 받아서 그 값을 가지고 assert 하면 됩니다.

 

지금 작업하고 있는 소스를 올릴 수가 없어서 간단하게 따로 만들어 봤습니다.

직접 소스를 보면서 한번 더 익혀 보죠.

 

public class privatemethod

{

private String jUnitPrivate(String a, String b) {

String result = null;

result = a + " : " +b;

return result;

}

}

 

 

아주 간단한 소스 입니다.

그런데 메소드가 private 이죠?

이 메소드에 대한 jUnit test를 만들겠습니다.

 

우선 이 테스트할 클래스에 대한 인스턴스를 생성합니다.

privatemethod jPrivate = new privatemethod();

 

그 다음에는 해당 private 메소드를 담을 Method 객체 생성합니다.

Method m;

 

그리고 이 객체에 해당 private method 를 담습니다.

m = jPrivate.getClass().getDeclaredMethod("jUnitPrivate",String.class,String.class);

 

이제 이 메소드에 대한 접근을 허용해 줍니다.

m.setAccessible(true);

 

그리고 나서 invoke 메소드를 사용해서 이 메소드를 호출합니다.

호출 할 때는 input parameter들을 만들어서 같이 보내 줘야 겠죠?

 

String result =null;

String a = "Korea";

String b = "Seoul";

result = (String) m.invoke(jPrivate,a,b);

 

이제 result 객체에 return 값이 담겼을 테니까 그 결과에 대한 예상값과 실제 값을 가지고 assert 을 해야겠죠.

 

assertEquals("Korea : Seoul",result);

 

이렇게 하고 jUnit 을 돌리면 아래와 같이 녹색을 볼 수 있습니다.

 

 

 

 
완성된 소스는 아래와 같습니다.
 
 
 

public class jUnitPrivateTest

 

{

@Test

public void testJUnitPrivate(){

privatemethod jPrivate = new privatemethod();

Method m;

try

{

m = jPrivate.getClass().getDeclaredMethod("jUnitPrivate",String.class,String.class);

m.setAccessible(true);

String result =null;

String a = "Korea";

String b = "Seoul";

result = (String) m.invoke(jPrivate,a,b);

assertEquals("Korea : Seoul",result);

}

catch (Exception e)

{

// TODO Auto-generated catch block

e.printStackTrace();

}

}

/**

* @throws java.lang.Exception

*/

@BeforeClass

public static void setUpBeforeClass() throws Exception

{

}

/**

* @throws java.lang.Exception

*/

@AfterClass

public static void tearDownAfterClass() throws Exception

{

}

/**

* @throws java.lang.Exception

*/

@Before

public void setUp() throws Exception

{

}

/**

* @throws java.lang.Exception

*/

@After

public void tearDown() throws Exception

{

}

}

 
아래 소스를 다운받으셔서 테스트 해 보셔도 되요.
 
 
privatemethod.java
 
jUnitPrivateTest.java
 
반응형


반응형

오랜만에 영어 공부를 합니다.

 

아파트 관리사무실에서 메일이 왔는데요.

 

얼마전 조깅 코스에서 방울뱀이 발견됐다고 조심하라고 하네요.

발견하면 즉시 신고하라고.....

 

IMPORTANT - RATTLE SNAKES REPORTED ON JOGGING TRAIL

 

TO ALL RESIDENTS OF AAA APARTMENTS:

 

We are notifying you that live Rattlesnakes have been found on our jogging path recently. Please be cautious and take whatever safety precautions you deem necessary whenever you, your occupants and guests see a Rattlesnake on the jogging path and/or the Community grounds.

Animal Control was notified and they removed one Rattlesnake from the jogging path. If you see a Rattlesnake, please contact Animal Control at (619)236-.....

Sincerely,

 

 

 

 

중요 - 조깅코스에서 방울뱀 목격

 

AAA 아파트에 거주하시는 모든 분께

 

최근에 조깅 코스에서 방울뱀이 목격됐음을 알립니다.

여러분과 같이 거주하시는 분들이나 손님들이 조깅 코스나 단지내에서 방울뱀을 발견할 수도 있으니 항상 조심하시고 안전과 관련 특별히 주의를 기울여 주시기 바랍니다.

Animal Control 에서 조깅코스에서 방울뱀 한마리를 제거했다고 연락이 왔습니다. 만약 방울뱀을 보시거든 Animal Control (619)236-..... 로 연락을 주시기 바랍니다.

 

감사합니다.

 

반응형