'분류 전체보기'에 해당되는 글 1012

  1. 2010.07.04 데이터베이스 문제점 파악 방법
  2. 2010.07.03 CVS - ProxyHTTP: java.io.IOException
  3. 2010.06.30 NULL 주의
  4. 2010.06.29 한국이 16강전서 흰색 유니폼 입는 까닭
  5. 2010.06.26 JEUS 구조 및 메뉴얼
  6. 2010.06.21 에러 잡기의 단계
  7. 2010.06.18 이클립스에서 Annotation 색상 변경하기
  8. 2010.06.17 SQL Server 2005 에서 2000 으로 변경하기
  9. 2010.06.15 스프링 ApplicationContext
  10. 2010.06.15 몇자 끄적임.
  11. 2010.06.15 업무상 주고 받는 이야기는 무조건 근거를 남긴다.
  12. 2010.06.13 이래도 흥, 저래도 흥
  13. 2010.06.12 [Getting Started with Grails] 1. Introduction, 2. Installing Grails
  14. 2010.06.12 승률 5할이 눈앞인데 날씨가 안좋다.
  15. 2010.06.11 엉덩이가 멋진 오지환과 기본 훈련
  16. 2010.06.10 씨작
  17. 2010.06.09 파이어폭스에서 구글캘린더에 접속이 안됨.
  18. 2010.06.09 Escobar flashes the leather
  19. 2010.06.08 속성 일본어 첫걸음
  20. 2010.06.08 Java Mail API
  21. 2010.06.05 Mockito 를 이용한 테스트
  22. 2010.06.04 윈도우 프로세스 - 동일한 실행 파일을 사용한 서비스
  23. 2010.06.04 ActiveX 설치하기 - 실패
  24. 2010.06.02 2010년도 체육대회
  25. 2010.06.02 단위 테스트에서 외부 자원을 대체하기
  26. 2010.06.02 Windows 7 에서 ActiveX 설치하기
  27. 2010.06.01 동영상 강의 보기
  28. 2010.06.01 NBTScan
  29. 2010.05.28 몰랐던 vi 기능
  30. 2010.05.26 오랜만에 스트림을 다뤘더니 헤맨다. ㅎㅎ

데이터베이스 문제점 파악 방법

어떤 계정으로
어느 시스템에서
어느 데이터베이스를 사용했을때
어떤 프로그램을 통해서
어떤 쿼리를 실행시켰을때
상황이 어떠하며
에러가 발생했는지를 확인하는 것이 중요하다.

SQL Server는 Profiler를 이용하는 것이 가장 좋다.

사례1) SQL Server 에서 락이 발생
app_user 로 로그인해서 : sp_who
dev_server 에서 쿼리를 실행함. : sp_who
ERP 데이터베이스를 사용 : sp_who
알 수 없는 쿼리 : dbcc inputbuffer(spid), 쿼리 확인
X Lock 을 걸고, 다른 프로세스에서 SELECT 를 하는데 락이 걸림 : sp_lock

[todo] 오라클에서는?

CVS - ProxyHTTP: java.io.IOException

Problems reported while synchronizing CVS Workspace. 0 of 2 resources were synchronized.
  An error occurred synchronizing /a_proj_3.0/src/운영_serverConfig.properties: Could not connect to :pserver:user5@1.2.3.4:/cvs: I/O exception occurred: ProxyHTTP: java.io.IOException
    Could not connect to :pserver:user5@1.2.3.4:/cvs: I/O exception occurred: ProxyHTTP: java.io.IOException
    ProxyHTTP: java.io.IOException

IE에 프록시 설정을 했더니 이클립스에서 CVS 저장소와 동기화하면서 발생한 에러

NULL 주의

- SQL Server 2000

- NULL과 연산을 하면 NULL이다.


- NULL을 찾을때는 IS를 사용해야 한다.(=이 아님)

한국이 16강전서 흰색 유니폼 입는 까닭

JEUS 구조 및 메뉴얼

   설정 파일
 노드  JEUSMain.xml
     엔진 컨테이너  
         EJB 엔진  EJBMain.xml
         Servlet(웹 컨테이너) 엔진  WEBMain.xml
             Context Group  
                 Virtual Host  
                     Context  jeus-web-dd.xml
         JMS 엔진  JMSMain.xml
         Web Server 엔진  
     JEUS Manager  

- 노드는 JEUS Manager와 여러 엔진 컨테이너의 집합체

- JEUS Manager는 노드에서 하나 밖에 없는 물리적인 구성 요소이고 부팅시에 시작점이 된다. 이것의 역할은 노드에 속한 여러 엔진 컨테이너를 관리하고 이들이 공통적으로 필요로 하는 서비스를 제공한다.
또한 엔진 컨테이너에서 공통적으로 필요로 하는 서비스를 제공한다.
JNDI 서비스, 보안(Security) 서비스, 로깅 서비스가 대표적이다.

- Context Group은 “Web Container 안의 Web Container”로 생각할 수 있다.
그 뿐만 아니라 Context Group은 복수 개의 웹 어플리케이션(컨텍스트)를 호스팅 할 수 있는 Virtual Server라고 생각할 수 있다.

- 컨텍스트는 Context Group바로 아래에 또는 Context Group내의 Virtual Host에 바로 디플로이 가능하다.
전자의 경우에는 컨텍스트가 묵시적으로 기본 Virtual Host에 속한다고 볼 수 있다.

- JEUS의 디렉토리 구조
- Context Group 디렉토리 구조
- Web Application의 디렉토리 구조

- 8.3. Web context 등록
8.3.2. Context 디렉토리 생성
8.3.3. Deployment Descriptor 파일 설정
8.3.4. Web DD 설정
8.3.10. context 등록하기
    웹 애플리케이션을 디플로이하는 방법
    여러 방법중 JEUSMain.xml에 <application>으로 context를 등록후 컨테이너를 재기동한다.
8.3.12. 등록 확인
    jeusadmin 툴 사용

- 3장. 어플리케이션 작성 및 디플로이 하기
    영구 모듈 : JEUSMain.xml의 <application> 태그에 등록되어 있는 어플리케이션

- 참고
JEUS 6 메뉴얼
JEUS 5.0 릴리즈 노트

에러 잡기의 단계

1. 말 그대로 디버깅을 한다.
디버깅 툴이나 IDE에서 제공하는 디버깅 기능을 이용해서 디버깅을 한다.
처음에는 신기해 한다.
그러나...원격에서 운영되고 있는 서버를 디버깅 모드로 돌릴 수는 없잖아.

2. 철두철미하게 로깅을 한다.
로그를 잘 남기면 에러 잡는 거는 시간 문제다.
로그 파일이 엄청나게 쌓인다. ㅎㅎ
로그는 정확하게 영리하게 남겨야 한다.

3. 테스트 케이스를 작성한다.
테스트 케이스를 통해서 에러가 발생할 곳을 미리 찾아 낸다.
운영중에 에러가 발생하더라도 테스트 케이스를 실행해서 힌트를 얻는다.
진정한 고수의 수준이 아닌가 싶다.

- 기본적으로는 에러 체크/예외 처리를 잘하고 방어적인 코딩을 해야겠지

이클립스에서 Annotation 색상 변경하기

처음 이클립스를 사용하면서 제일 마음에 들었던 것이 Mark Occurrences 기능이었다.
어떤 변수나 메서드가 사용된 곳을 표시해 주는 아주 유용한 기능이다.

텍스트 편집기에서 코딩할 때는 Ctrl + F3, F4 를 애용했었는데.

그런데 하나 불만인 것이 연한 회색으로 표시되어서 눈에 잘 띄지가 않는다는 것이다.

오늘 마음 먹고 뒤져 봤다.
여기저기 뒤져보니 나온다. 음하하

Box나 Dashed Box보다 Highlighted가 낫다.
Squiggly Line 구불구불한 선
Vertical Bar

 

2011-01-10 추가

색은 다른거와 구별되는 밝은 노란색...이 좋네. Warning과 중복되어서 구별 안됨.

2021-07-05 빨간색 계열은 에러, 검은색은 에디터에서 안보임.

  초록색ㅋ

 

SQL Server 2005 에서 2000 으로 변경하기

- row_number() 함수가 2000에서는 지원되지 않으므로 페이징 쿼리를 다시 작성

- 동의어 지원 안됨
원격 뷰, 원격 프로시저에 동의어를 사용했음.
기존 동의어 이름과 동일한 뷰를 만들고 이 뷰가 원격 뷰를 참조하도록 한다.
프로시저도 마찬가지.

스프링 ApplicationContext


[todo] new ClassPathXmlApplicationContext(ApplicationContext parent)
는 왜 만들어둔걸까?

몇자 끄적임.

여기 분위기 보니깐 할랑한 장기 SM자리 하나 맡아서 은둔생활하는 것도 좋을 듯하다.
수입은 500이상 받을 수 있을거고.
대신 휴가가 4일밖에 안되네.

여기 인도얘들 도대체 머하나?

- 다른 이야기
트위터하는 것도 괜찮겠다.
너무 자주 하지만 않으면.

카테고리를 상세하게 두지 않는 이유
여기도 속하고 저기도 속한다.
그런 고민으로 시간 뺏기기 싫다.
그러나 태그 때문에 시간 많이 소비한다. ㅋㅋ

음..요즘 보고를 안하네.

업무상 주고 받는 이야기는 무조건 근거를 남긴다.

메일, 문서, 회의록, 대화 등
필요한 경우 서명을 받아야 한다.
참조에 이해관계자들을 포함시킨다.

이렇게 해도 뒤집는 경우도 있기는 하지만.
안전 장치이기도 하고 요즘 오락가락하는 기억력에 대한 대비도 되고.
작성하는 사람, 보는 사람, 참조하는 사람 모두에게 구속력이 생기게 된다.

이래도 흥, 저래도 흥

영업에 너무 쉽게 해주고 있네.
D사에 팀원을 5월 중간까지 추가로 지원하기로 한거, 거기에 추가로 5월말까지
D사에 한명 더 일주일 추가 투입
A통신사 인터페이스 추가도 그냥 내가 한다고 하고 상의없이 먼저 보고해 버리고...

지금은 1주지만 이틀, 사흘 지원하면 2주, 한달이 됨.
왜 지원해야 하고, 언제까지 한다는 명확한 계획이 있어야 함.

절차나 내용에 대한 사전협의가 왜 없나?

생색을 내야 함.

N사 디자인 지원, D사 인력상주 연장, 왜 영업에서 그냥 통보만 받고 내가 처리했나?
왜 보고 안했지?
요즘 내가 왕이네. 영업은  그 정도는 팀장선에서 처리 가능하다고 본건가? 이사님은 사전협의에 대한 걸 말한거고?

안되는건 안된다고 단호하게 말해야 한다.

[Getting Started with Grails] 1. Introduction, 2. Installing Grails

1. Introduction
Grails는 Spring, Hibernate등을 이용한 오픈소스 웹 어플리케이션 프레임워크다.

달리기 클럽을 위한 RaceTrack이라는 웹 어플리케이션을 만들고 이 어플리케이션을 확장시켜 본다.

2. Installing Grails
JDK 1.5 필요
여기서는 Grails 1.2 사용

- 설치방법
압축을 풀고 , GRAILS_HOME 환경변수를 잡고, GRAILS_HOME/bin을 PATH에 추가한다.

Grails는 HSQLDB를 내장하고 있다.
이 책에서는 나중에 MySQL을 사용한다.

승률 5할이 눈앞인데 날씨가 안좋다.

푸하하.
오늘 경기를 이기면 드디어 승률이 5할이 된다.
게다가 기아와 삼성이 모두 지거나 한팀이라도 지면 3, 4위로 올라가게 된다.

현재 3위팀의 선발 매치업이 기가 막히게 재미있다.
엘지 봉타나 대 기아 로페즈.
넥센 금동이 대 삼성 크루세타
그리고 한화 최영필 대 자이언츠 승준이.

문제는 날씨다.
분위기가 좋을때 계속 타고 가야 하는데.

출처는 스태티즈와 다음

- 날씨가 점점 더워지고 투수들의 어깨가 어느 정도 무거운 시점에서 페넌트레이스가 점점 재미있어 질거 같다.
SK의 행보가 재미있게 진행될거 같고, 두산은 흐림이 될거 같음.
넥센이 탄력을 받고 올라올 수 있는 흐름이 될듯.

엉덩이가 멋진 오지환과 기본 훈련

- [정철우의 포토로그] '엉덩이 미남' 오지환의 숨은 노력

한번씩 오지환 선수가 수비하는 뒷모습을 보고 엉덩이 아래 근육이 멋지다는 생각을 했었는데 이런 기사가 나오네.
딱 달라붙는 유니폼때문에 더 도드라져 보이긴 하지만.
LG 여성팬들 많이 설레겠다. ㅎㅎ

기사를 보니 열심히 노력하는거 같다.(물론 열심히 노력하지 않는 선수는 없다.)
인기구단의 키맨으로 부담감이 상당할테지만 극복해야지.

덕과장과 오지환 홈런 개수에 대해서 이야기했는데 홈런 20개 이상은 힘들다고 생각했다.
손목힘은 타고 났지만 그것만으로는 부족하지 않은가.

- 역시 기본이 중요하다.
사진 출처는 네이트

씨작

평일점심 27,000원
평일저녁, 주말, 공휴일 45,000원
세금 빼고.

뷔페 음식을 좋아하지 않는데, 지금까지 먹어본 뷔페중에 제일 낫다.
제일 비싸니깐 그렇기도 하고 회를 좋아하는 내 식성에 맞다.

회가 이 집의 주무기인듯.
대게는 줄서지 않고 먹을수 있는게 좋기는 하지만 속이 조금 부실하다.
초밥은 와사비가 좀 많은 듯.
(내가 원체 싱겁게 먹으니...)
철판구이 좋고.
전복, 문어...술안주가 널렸는데 6명이서 술은 고작 3병.

그런데 일행이 있어 많이 즐기지는 못했음.


파이어폭스에서 구글캘린더에 접속이 안됨.

- http://forums.mozilla.or.kr/viewtopic.php?p=34121

설정 - 개인 정보 - 쿠키 삭제 - 쿠키 관리자

Escobar flashes the leather

http://mlb.mlb.com/video/play.jsp?content_id=8689365

가죽제품을 휙 내보이다.
아주 뛰어난 수비를 했다는 말이겠지.

속성 일본어 첫걸음



하루 10분 6주 완성이라고 한다.
아주 기초적인 내용이 잘 정리되어 있다.
학원 3개월 과정 정도 될듯 하다.

예전에 배운 일본어에 대한 내용을 되살리기 위해 구입.

사역형이나 수동형 관련 내용은 없다.
서점에 가서 아주 쉬운 독해책을 하나 찾아봐야겠다.

이거 괜찮을까?

Java Mail API

- README 파일 내용
mail.jar        The JavaMail API and all service providers, most users need *only* this jar file
lib/mailapi.jar    The JavaMail API with no service providers
lib/imap.jar    The IMAP service provider
lib/smtp.jar    The SMTP service provider
lib/pop3.jar    The POP3 service provider
lib/dsn.jar        multipart/report DSN message support

demo/README.txt    Instructions for running the demo programs
demo/CRLFOutputStream.java    demo OutputStream filter to convert all line terminators
to CRLF
demo/NewlineOutputStream.java    demo OutputStream filter to convert all line terminators to platform's line terminator
demo/copier.java    demo program to copy mail between folders
demo/folderlist.java demo program to list subfolders
demo/monitor.java    demo program to monitor for new mail
demo/mover.java    demo program to move mail between folders
demo/msgmultisendsample.java
demo program to send a sample multipart message
demo/msgsend.java    demo program to send a single part text message to a specified recipient (ala /bin/mail)
demo/msgsendsample.java    demo program to send a sample single part text message
demo/msgshow.java    demo program to read messages from an IMAP store
demo/namespace.java    demo program that illustrates use of namespace APIs
demo/populate.java    demo program that copies entire folder hierarchies
demo/registry.java    demo program that illustrates the registry
demo/search.java    demo program to search folders
demo/sendfile.java    demo program to send a file as an attachment
demo/sendhtml.java  demo program to send html mail
demo/smtpsend.java    demo program to illustrate handling SMTP error codes
demo/transport.java    demo program to illustrate use of Transport
demo/uidmsgshow.java    demo program to read messages from an IMAP store
demo/client/    source files for cool demo program that implements a simple mail reader. (Uses Swing)
demo/client/README.txt    README file for running the simple mail-reader demo
demo/servlet/    source for a simple servlet that allows using a web browser to read and send mail
demo/servlet/README.txt    README file that describes the JavaMailServlet

볼만한 예제가 많다.
웹메일 시스템을 만들어도 되겠다.

- 이 그림을 보면 구조가 잡힌다.
MIME 타입에 따라 처리를 해야 한다.

- JDK 1.6에는 JAF가 포함되어 있다.[각주:1]
        JavaMail(TM) API 1.4.3 release
        ------------------------------

Welcome to the JavaMail API 1.4.3 release!  This release includes
versions of the JavaMail API implementation, IMAP, SMTP, and POP3
service providers, some examples, and documentation for the JavaMail
API.

Please see the FAQ at http://java.sun.com/products/javamail/FAQ.html

JDK Version notes
-----------------

The JavaMail API supports JDK 1.4 or higher.  Note that we have
currently tested this implementation with JDK 1.4, 1.5, and 1.6.

While JavaMail will work with JAF 1.0.2, we recommend the use of JAF 1.1
or newer.  JAF 1.1.1 is currently the newest version.  Note that JAF 1.1
is included in JDK 1.6 and JAF 1.1.1 is included in JDK 1.6.0_10 and
later.

* 오늘의 교훈 : README 파일이나 메뉴얼을 잘 읽자.
  1. 2010-06-08 오늘 알았음. [본문으로]

Mockito 를 이용한 테스트

https://javacan.tistory.com/entry/MocktestUsingMockito
https://bestalign.github.io/2016/07/08/intro-mockito-1/

- http://code.google.com/p/mockito/

- 단위 테스트에서 외부 자원을 대체하기 에서 사용한 코드를 Mockito를 이용해서 만들어 본다.

- Mockito를 적용
public class DatabaseExampleTest {
    @Test
    public void testReadAbc() throws SQLException {
       
        MockResultSet rs = new MockResultSet();
        rs.addRow(new Object[]{101, "John"});
       
        //MockStatement st = new MockStatement();
        //st.setResultSet(rs);
        Statement st = mock(Statement.class);
        stub(st.executeQuery("SELECT empno, empid FROM TestTable")).toReturn(rs);
       
        //MockConnection con = new MockConnection();
        //con.setStatement(st);
        Connection con = mock(Connection.class);
        stub(con.createStatement()).toReturn(st);
       
        DatabaseExample example = new DatabaseExample();
        assertEquals("1:101,John\n", example.readAbc(con, "TestTable"));
    }
}

- 11번째 라인은 다음과 같이 간단하게 변경할 수 있다.
stub(st.executeQuery("SELECT ... FROM TestTable")).toReturn(rs);
stub(st.executeQuery(anyString())).toReturn(rs);
stub(st.executeQuery(startsWith("SELECT"))).toReturn(rs);
org.mockito.Matchers에 any*() 등 다양한 메서드가 있다.

- 어노테이션을 사용할 수 있다.
@RunWith(MockitoJUnitRunner.class)
public class DatabaseExampleTest {

    @Mock private Connection con;
    @Mock private Statement st;
    private MockResultSet rs;
    DatabaseExample example;
   
    @Before
    public void setUp() throws Exception {
        rs = new MockResultSet();
       
        st = mock(Statement.class);
        stub(st.executeQuery(anyString())).toReturn(rs);
       
        con = mock(Connection.class);
        stub(con.createStatement()).toReturn(st);
       
        example = new DatabaseExample();
    }
   
    @Test
    public void testReadAbc() throws SQLException{       
        rs.addRow(new Object[]{101, "John"});
        assertEquals("1:101,John\n", example.readAbc(con, "TestTable"));
    }

    @Test
    public void testReadAbcWithMultiRow() throws SQLException{       
        rs.addRow(new Object[]{101, "John"});
        rs.addRow(new Object[]{102, "Jane"});
        assertEquals("1:101,John\n2:102,Jane\n", example.readAbc(con, "TestTable"));
    }
}

- 비지니스 로직이 있는 MockResultSet 은 대체하지 않는 것이 좋다.


윈도우 프로세스 - 동일한 실행 파일을 사용한 서비스

개발자가 프로그램을 올리고 콘솔에서 WAS를 다시 시작시킴.
WAS가 내려가 있는 줄 알고 다시 시작했고(WAS를 내리지 않고 작업을 했음) 사이트가 제대로 돌아가는지 확인은 하지 않음.
사이트가 돌아가지 않아 서버관리자가 재부팅을 시킴.
서비스에 등록된 WAS가 동작해서 서비스함.

> netstat -nao | findstr LIST | findstr :80
  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       1920
  TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       1900

> tasklist | findstr httpd
httpd.exe                     1708 Console //80
httpd.exe                     1732 Console //8080

> tasklist | findstr java
java.exe                      1900 Console //8080
java.exe                      1920 Console //80

> tasklist /m | findstr httpd
httpd.exe                     1708 ntdll.dll, kernel32.dll, WS2_32.dll,
httpd.exe                     1732 ntdll.dll, kernel32.dll, WS2_32.dll,
                                   libhttpd.dll, USER32.dll, GDI32.dll,
                                   libhttpd.dll, USER32.dll, GDI32.dll,
                                   libhttpd.dll, USER32.dll, GDI32.dll,

테스트용으로 등록해뒀는 서비스가 8080포트로 동작하고 있었음.
사용하지 않는 서비스는 사용않함으로 둘 것.

PrcView에서 1708 httpd.exe의 커맨드라인 확인
"c:\resin-pro-3.0.25\httpd.exe" -service -java_home  C:\Java\jdk1.5.0_12 -resin_home  c:\resin-pro-3.0.25  -J-server  -Xms512m  -Xmx512m  -XX:PermSize=256m  -XX:MaxPermSize=256m

서비스에 등록된 실행경로
"c:\resin-pro-3.0.25\httpd.exe" -service -java_home  C:\Java\jdk1.5.0_12 -resin_home  c:\resin-pro-3.0.25  -J-server  -Xms512m  -Xmx512m  -XX:PermSize=256m  -XX:MaxPermSize=256m

1708은 80포트를 사용하는 서비스임.

테스트 WAS의 실행경로
"C:\resin-pro-3.0.25\httpd.exe" -service -java_home  C:\Java\jdk1.5.0_12 -resin_home  C:\resin-pro-3.0.25  -J-server  -Xms512m  -Xmx512m  -XX:PermSize=256m  -XX:MaxPermSize=256m  -conf  conf/test.conf  -server  test

PrcView에서 1920 java.exe의 커맨드라인
"C:\Java\jdk1.5.0_12\bin\java.exe" "-server" "-Xms512m" "-Xmx512m" "-XX:PermSize=256m" "-XX:MaxPermSize=256m" -classpath "c:\resin-pro-3.0.25\classes;c:\resin-pro-3.0.25\lib\resin.jar;C:\Java\jdk1.5.0_12\lib\tools.jar;C:\Java\jdk1.5.0_12\jre\lib\rt.jar;c:\resin-pro-3.0.25\lib\activation.jar;..." -Dresin.home="c:\resin-pro-3.0.25" -Dserver.root="c:\resin-pro-3.0.25" -Djava.util.logging.manager=com.caucho.log.LogManagerImpl -Djavax.management.builder.initial=com.caucho.jmx.MBeanServerBuilderImpl com.caucho.server.resin.Resin -socketwait 1029

> netstat -nao | findstr 1029
  TCP    127.0.0.1:1029         0.0.0.0:0              LISTENING       1708
  TCP    127.0.0.1:1029         127.0.0.1:1036         ESTABLISHED     1708
  TCP    127.0.0.1:1036         127.0.0.1:1029         ESTABLISHED     1920

- PrcView로 프로세스 트리를 확인해 봄.


- 서비스가 아닌 구동 스크립트로 시작한 경우의 프로세스

직접 실행시킨 경우 사용자가 Administrator로 되어 있고 세션 이름이 RDP-...(원격데스크톱으로 들어갔음, 직접 들어가면 Console인가?)이다.
서비스로 구동시켰을때는 SYSTEM이고 세션 이름이 Services이다.

- ptree, tlist 등의 도구를 활용하면 비슷한 결과를 얻어낼 수 있다.

ActiveX 설치하기 - 실패

모 보험사에서 받은 보안 메일을 여는데 ActiveX와 씨름했다.
이놈은 3개나 설치해야 한다.
http://www.hi.co.kr/file/etc/IniSafeMail.cab#version=4,0,1,3
http://update.hi-portal.co.kr/distribution/reportdesigner/SmartUpdate/SmartUpdate.cab#version=1,0,0,24
http://update.hi-portal.co.kr/distribution/markany/MaDownloadRD.cab#version=1,0,1,0

다운로드 받아 압축을 풀고 설치를 하는데 SmartUpdate(ReportDesigner)는 실행파일이 없이 dll과 inf파일만 있다.
inf파일을 설치하려고 하면 설치 오류가 난다.

이런 경우에는 어떻게 해야 하나?
dll파일을 WINDOWS/system32/에 두면 되나? -> 안됨.
WINDOWS/Downloaded Program Files/에 두면 되나? -> 안해 봤음.

2010년도 체육대회

잠원한강공원
한남대교 아래
축구장, 땅은 안좋다.
천막이 몇 개 있음.

한남대교 전망대 버스정류장 있음.
강남역 방면에서 241A, 421, 3011 을 타면 됨.
(나갈때는 어떻게?)



이번 체육대회... 몸이 전혀 안따른다.
몸이 너무 무겁다.


단위 테스트에서 외부 자원을 대체하기

테스트를 할때 데이터베이스 연결, 네트워크상에 존재하는 자원 참조등 외부 자원을 사용해야 하는 경우에는 단위 테스트를 하기가 쉽지 않다.
단위 테스트는 테스트 대상이 제대로 동작하는지 검사하는 것이 목적이므로 여기에 집중하기 위해 외부 자원, 의존 클래스를 Mock 객체로 대체한다.

- 참고
Mock Object 를 사용해서 쉽게 테스트 하기
Using mock objects for complex unit tests

- 우리가 일반적으로 작성하는 DAO
public class DatabaseExample {
    public String readAbc(Connection con, String tableName) throws SQLException{
        int resultNum = 1;
        Statement st = con.createStatement(); //대상(#1)
        ResultSet rs = st.executeQuery("SELECT empno, empid FROM " + tableName); //대상(#1)
        String result = "";
        
        while(rs.next()){ //대상(#2)
            int no = rs.getInt(1); //대상(#2)
            String id = rs.getString(2); //대상(#2)
            result += resultNum++ + ":" + no + "," + id + "\n";
        }
        return result;
    }
}

- 데이터베이스없이 테스트가 가능하도록 Mock객체를 만든다.(대상 #1)
public class MockConnection implements Connection {
    ...
    @Override
    public Statement createStatement() throws SQLException {
        return new MockStatement();
    }
}

public class MockStatement implements Statement {
    ...
    @Override
    public ResultSet executeQuery(String sql) throws SQLException {
        return new MockResultSet();
    }
}

public class MockResultSet implements ResultSet

- 테스트 코드를 작성한다.
public class DatabaseExampleTest {
    @Test
    public void testReadAbc() throws SQLException {
        Connection con = new MockConnection();
        DatabaseExample example = new DatabaseExample();
        assertEquals("1:101,John\n", example.readAbc(con, "TestTable"));
    }
}

- 결과는 테스트 실패다.
org.junit.ComparisonFailure: expected:<[1:101,John]> but was:<[]>
MockResultSet.next()가 제대로 구현되지 않아서 false를 리턴해서 결과적으로 테스트가 실패했다.

- 테스트를 다시 작성한다.
public class DatabaseExampleTest {
    @Test
    public void testReadAbc() throws SQLException {
        
        MockResultSet rs = new MockResultSet();
        rs.addRow(new Object[]{101, "John"});
        
        MockStatement st = new MockStatement();
        st.setResultSet(rs);
        
        MockConnection con = new MockConnection();
        con.setStatement(st);
        
        DatabaseExample example = new DatabaseExample();
        assertEquals("1:101,John\n", example.readAbc(con, "TestTable"));
    }
}

- Mock 객체를 다시 작성한다.(대상 #2)
외부에서 입력한 값에 따라 결과를 반환하도록 구현한다.
public class MockResultSet implements ResultSet {

	List<Object[]> list;
	Object[] currentRow;
	int index = -1;
	
	public MockResultSet(){
		list = new ArrayList<Object[] >();
	}
	
	public void addRow(Object[] row){
		list.add(row);
	}

	@Override
	public boolean next() throws SQLException {
		if(++index < list.size()){
			currentRow = list.get(index);
			return true;
		}else{
			return false;
		}
	}
	
	@Override
	public String getString(int columnIndex) throws SQLException {
		return currentRow[columnIndex - 1].toString();
	}
	
	@Override
	public int getInt(int columnIndex) throws SQLException{
		return ((Number)currentRow[columnIndex - 1]).intValue();
	}
	...
}

- 필드로 뺄수 있는 부분은 빼고 setUp()를 활용한다.
결과가 여러 줄을 리턴하는 경우 테스트도 추가한다.


Windows 7 에서 ActiveX 설치하기

국민은행 앱이 나왔다.
인증서를 가져와야 한다고 한다.
그런데 이놈의 ActiveX가 또 말썽이다.
지마켓 안심결제, yes24에 이어 여기도 말썽이다.[각주:1]
내가 왜 윈도우7을 설치했는지...쩝
언제나 ActiveX에서 벗어날수 있을런지 모르겠다.

여튼 뒤져보자. 이 버튼을 클릭해도 반응이 없다.
ExportCertificate()는 UniSign.js에 있다.
http://www.unisign.co.kr/kbstar/UniSign.js
이러고 있다.
설치파일을 다운로드한다.
http://www.unisign.co.kr/UniSign/UniSign.cab#version=1,0,0,1

Cab파일을 다운로드 받아 압축을 풀고
UniSign.exe를 실행시켜서 설치한다.
이제야 제대로 진행이 된다.

제발 이런 짓 좀 안하게 해줬으면 좋겠다.



  1. 수동으로 설치할 수 있는 파일이 제공되면 그것으로 해결이 된다. - 대부분의 은행이 그랬다. [본문으로]

동영상 강의 보기

분당으로 출장갈 일이 있어 책을 가져갈까 하다 그동안 수집(?)해둔 동영상 강의를 듣기로 했다.

PMP U43에는 PM과정, 스프링 웨비나 같은 형식이 좋다.
Mock 테스팅같이 라이브 코딩이 나오는건 노트북에서 봐야 함.
스프링웨비나 중 Grails Twitter 도 U43이나 아이팟에서 보면 안됨.

모델링 강의는 U43에서 어떨라나.
결국 U43은 TV출력용이다.
인코딩만 하면 PM과정같은 강의는 아이팟에서도 볼수 있는데 무겁게 그 벽돌을 들고 다니는건 좀 아니다.

아이팟에 미드 넣어두고 보면 좋을거 같다.
인코딩할때 자막까지 들어갈까?

NBTScan

http://www.inetcat.net/software/nbtscan.html
http://www.unixwiz.net/tools/nbtscan.html

패킷 덤프도 되는듯
여러 옵션 사용해보기

소스도 제공한다

iPod 에서 작성된 글입니다.


몰랐던 vi 기능

- 현재 행 첫번째 글자로 가기
소스 코드는 들여쓰기가 되어 있어서 0, w로 이동했다.
^로 바로 이동 가능함.
그런데 0, w가 가까워서 더 좋은거 같다. 손에 안익어서 그런가?

- * : search for word for under cursor
이렇게 좋은걸 이제 알았다.

- script 기능
플러그인처럼 삽입할 수 있는 많은 기능이 있다고 한다.
ftp 접속도 가능하다고 하는데 vim으로 갈까?

vi 현재커서의 아스키값 ga
http://rasskang.tistory.com/18
=>hexa코드 볼때? 비교?


오랜만에 스트림을 다뤘더니 헤맨다. ㅎㅎ

int java.io.InputStream.read() throws IOException
스트림으로부터 데이터를 읽는다.
리턴값은 읽어들인 바이트이고 0 ~ 255 사이의 값을 가진다.
스트림 끝에 도달해서 더이상 읽을 것이 없을때에는 -1을 리턴한다.

int java.io.InputStream.read(byte[] b) throws IOException
스트림으로부터 데이터를 읽어서 바이트 배열에 저장한다.
리턴값은 읽어들인 데이터의 길이이고, 스트림 끝에 도달해서 더이상 읽을 것이 없을때에는 -1을 리턴한다.
인자인 바이트 배열의 길이가 0인 경우 0을 리턴한다.(바이트 배열의 길이가 0보다 큰 경우에는 0을 리턴하지 않는다. 스트림 끝에 도달하면 -1을 리턴한다.)
java.io.FileOutputStream.FileOutputStream(File file) throws FileNotFoundException
출력할 파일이 없으면 예외가 발생한다.
이어쓰기를 하지 않는다.