특정월의 메인아이디 별로 매출을 뽑을려고 다음과 같이 코딩을 하였습니다.

sql.xml 소스

<mapper namespace="billMapper">

 <select id="selectListByMonth" parameterType="String" resultType="List<net.red.vo.ResVo>">

 SELECT B.MID, SUM(A.AMT_VAT)/1.1 AS AMT , SUM(A.AMT_VAT) AS TOT_AMT

 FROM UTH A

  WHERE DT LIKE #{value} || '%'

    GROUP BY B.MID 

 </select>

</mapper>


a.java 소스

List<ResVo> listResVo = (List<ResVo>)session.selectList("mapper.selectListByMonth", yyyymm);


MyBatis 에 대하여 경험이 적는 저로서는 문제가 없어보이는 코드였다...

그런데 에러가 났습니다. 컴파일부터 안됐습니다....


구글을 뒤져봐도 한글로 된 제대로된 설명이 없었습니다. ㅜㅜ

심지에 MyBatis 공식 메뉴얼에도 설명을 잘 못찾겠었습니다.


안되는 영어를 보면서 알고 봤더니. 이유가 있었습니다.


너무 쉬운 계념이라서 그랬습니다. ㅡㅡ;


아래는 정상적으로 동작하는 소스입니다.


sql.xml 소스

<mapper namespace="billMapper">

 <select id="selectListByMonth" parameterType="String" resultType="net.red.vo.ResVo">

 SELECT B.MID, SUM(A.AMT_VAT)/1.1 AS AMT , SUM(A.AMT_VAT) AS TOT_AMT

 FROM UTH A

  WHERE DT LIKE #{value} || '%'

    GROUP BY B.MID 

 </select>

</mapper>


a.java 소스

List<ResVo> listResVo = session.selectList("mapper.selectListByMonth", yyyymm);


즉...구지  resultType="List<net.red.vo.ResVo>" 라고 해서 정의하지 않아도

selectList 를 사용하면 <select> 에서는 net.red.vo.ResVo 라는 List 

(즉 여러개의 ResVo 들...)로 회신을 해주는 개념이였습니다.



Posted by 빨강토끼
,

Act with Prudence - Seb Rose


"whatever you undertake, act with prudence and consider the consequences" Anon


NO MATTER HOW COMFORTABLE A SCHEDULE LOOKS at the beginning of an iteration, you can't being under pressure some of the time. If you find yourself having to choose between "doing it right" and "doing it quick." it is often appealing to "do it quick" with the understanding that you'll come back and fix it later. When you make this promise to yourself, your team, and your customer, you mean it. But all too often, the next iteration brings new problems and you become focused on them. This sort of deferred work is known as technical debt in his taxonomy of technical debt, and it should not be confused with inadvertent technical debt.


Technical debt is like a loan: you benefit from it in the short-term, but you have to pay interest on it until it is fully paid off. Shortcuts in the code make it harder ot add features or refactor your code. They are breeding grounds for defects and brittle test cases. The longer you leave it, the worse it gets. By the time you get around to undertaking the original fix, there may be a whole stack of not-quite-right design choices layered on top of the original problem, making the code much harder to refactor and correct. In fact, it is often only when things have got so bad that you must fix the original problem, that you actually do go back to fix it. And by then, it is often so hard to fix that you really can't afford the time or the risk.


There are times when you must uncur technical debt to meet a deadline or implement a thin slice of a  feature. Try not to be in this position, but if the situation absolutely demands it, then go ahead. But (and this is a big but) you must track technical debt and pay it back quickly, or things go rapidly downhill. As soon as you make the decision to compromise, write a tack card or log it in your issue-tracking system to ensure that it dose not get forgotten.


If you schedule repayment of the debt in the next iteration, the cost will be minimal. Leaving the debt unpaid will accrue interest, and that interest should be tracked to make the cost visible. This will emphasize the effect on business value of the project's technical debt and enables appropriate prioritization of the repayment. The choice of how to calculate and track the interest will depend on the particular project, but track it you must.


Pay off technical debt as soon as possible. It would be imprudent to do otherwise.


맞습니다.

급한 프로젝트일정때문에 가끔은 "제대로하기"(doing it right) 보다는 "빨리하기"(doing it quick)를 선택해야될 경우가 많다.

그러지 않기 위해서 노력해야겠지만 어쩔수 없는 경우에는

빠른 주기로 재대로 고치를 작업을 해야한다.

그렇지 않고 놔두다보면 나중엔 정말 일이커져서 엄청난 위기에 봉착할수 있다.

 

Posted by 빨강토끼
,

괜찮은 책인것 같아서 한 꼭지씩 주석을 달며 정리하려고 합니다.


원문은 CCL 라이센스가 있어서 블로그에 등록이 가능하지만


한글로 번역된 글은 저작권은 어떻게 될지몰라서 그냥 원문으로 정리 하겠습니다.


http://www.amazon.com/Things-Every-Programmer-Should-Know/dp/0596809484/ref=sr_1_5?s=books&ie=UTF8&qid=1393335474&sr=1-5&keywords=97


http://book.daum.net/detail/book.do?bookid=BOK00017977718BA

Posted by 빨강토끼
,

예전에는 필요한것이 있으면

http://www.sunfreeware.com 에서 다운로드 할수있었지만

언제부터인가 http://unixpackages.com 으로 유도하고 있더군요.


그런데 문제는 그사이트가 유료화되고 있다는 것입니다.


구글링을 하다보니 다행이 괜찮을 곳을 찾을수 있었습니다.


http://ftp.riken.jp/Sun/sunfreeware/sparc/


물론 다운받을수있는 버젼이 극히 제한적이다....



Posted by 빨강토끼
,

기사와 다른쪽으로 이야기가 흘러간 글입니다.

NoSQL 이나 NewSQL 관련 정보를 얻고 싶으시면 구글의 다른 검색 결과를 조회 하세요.


"새로운 SQL이 뜬다" SQL과 NoSQL의 장점 결합한 NewSQL

http://www.itworld.co.kr/news/71459

나는 나름 매출이 큰 서비스의 PG(payment gateway) 시스템을 개발하고 있다.
하지만 시스템에는 ESB 나 EAI 심지어는 MQ 도 사용하지 않고 있다.
그중 메인엔진은 스프링도 사용하지않고 pure JAVA 로 되어 있다.

이유는 간단하다. 검증이 안되서이다.
확장성도 좋고 유지보수도 더쉬어지고 심지어는 성능도 더 좋아진다고 하는데
쓰지 않는다.

웹이나 앱쪽은 참 빠르게 변화되는데 말이다.
다른 서비스는 빠르게 요구사항이 변화되고, 
검증되지 않은 문제점이 발견되더라도 대처가 유연하고
이러한 이유로 잠시 서비스를 중지 한다고 해서 큰사고로 이어지지 않는다.

하지만 코어개발쪽은 365일 24시간 무정지서비스가 원칙이다.
최초에 C 나 C++ 이 아니라 JAVA로 개발한다고 해서 이슈가 되었을 정도로
코어개발쪽(돈을 처리하거나 민감한 서비스는)은 최신 기술도입에 참느리다.

NoSql도 마찮가지다. 
빅데이터가 수많은 정보를 모아놓고 그중에 보물을 찾는 과정이라면
주어진 역활을 정확히 처리해야되는 상황에서는 오히려 그런 보물을 찾는 과정을 사치(?)로까지 생각하는 경향이 있다.

스터디 활동을 하며 이런저런 기술에 대하여 듣고 도전해보는 분들을 보며,
급격하게 변하는 세상속에서 나만 혼자 가만히 있는 것 같아서 두려움을 느낄 때가 많았다.

인터넷이나 책을 보면서 이것저것 공부를 해봐도,
가장 그 기술에 대하여  학습할 수 있는 가장 확실한 방법은
실무에 사용하는 것 만한 것이 없다. 

스프링을 반년동안 공부를 했지만 
실무에 적용하질 않으니 1년이 지난후에 기억나는 것은 별로 없다.

마치 영어를 공부하는 것과 같았다

핑계라면 핑계일까? 아니 나름 깨닳은 것이 있다면
항상 신기술에 흐름을 주목해야 하지만 무작정 신기술을 쫓아다니면 안되겠다는 것이다.
어쩜 그 기술을 실무에 써보기도 전에 다른 기술로 트랜드가 넘어가는 경우가 생길수도 있고,
어쩌면 평생 그분야의 일을 실무로 경험해보지 못할수도 있다.

마치 네트워크 프로그래밍쪽 일을 하거나 진로를 정한 개발자가
node.js 나 CSS 쪽에 관심을 갖는것처럼 ...
하지만 보안쪽일을 하게되면 그쪽의 지식이나 경험이 필요할 때가 분명 있긴하다.
그러나 아직 네크워크 프로그래밍이나 개발자체에 경험이나 실력이 부족하다면 
자기 분야에 좀 더 공부시간을 투자하는것이 더 도움이 될것같다.
대용량 DB 튜닝이나 OS쪽에 관심을 가지는 식으로 말이다.

모두들 javascript 나 빅데이터에 관심이 쏠려있다고 해서 이끌려 다닐 필요가 없는 듯 하다.

물론 그분야에 일을 하거나 관심이 있는 사람들에게는 그런 이슈들이 상당히 중요한 문제들이고 
꼭 필요한 과정이다.

나역시 매일 마음을 가다듬지만 매일같이 쏟아나오는 신기술에 대한 기사나 
튜토이얼 메뉴얼을 힐끔힐끔 검색하며 보고있는 내자신을 발견하게 된다....


Posted by 빨강토끼
,

hs_err_pid 파일을 열어보면 


# A fatal error has been detected by the Java Runtime Environment: # # SIGSEGV (0xb) at pc=0xff380700, pid=583, tid=3156104 # # JRE version: 6.0_16-b01 # Java VM: Java HotSpot(TM) Server VM (14.2-b01 mixed mode solaris-sparc ) # Problematic frame: # C [libc_psr.so.1+0x700] memcpy+0x2f8 ... --------------- T H R E A D --------------- Current thread (0x00746400): JavaThread "p: default-threadpool; w: Idle" daemon [_thread_in_native, id=3156104, stack(0xb0c00000,0xb0c80000)] siginfo:si_signo=SIGSEGV: si_errno=0, si_code=1 (SEGV_MAPERR), si_addr=0xfe0cc000 Registers: O0=0xfe0cbfc0 O1=0x00000000 O2=0xc3230063 O3=0x6f727465 O4=0x6d612f67 O5=0x70726f63 O6=0xb0c7c890 O7=0xfe202378 G1=0x00054000 G2=0x00c4f5d0 G3=0x00000000 G4=0xff140000 G5=0x03785238 G6=0x00000000 G7=0xb7314200 Y=0x00000000 PC=0xff380700 nPC=0xff380704 Top of Stack: (sp=0xb0c7c890) 0xb0c7c890: fe0c77d2 00000008 00000065 00007200 0xb0c7c8a0: 00000072 96898d9b ffffffff 00000000 0xb0c7c8b0: 03789a00 fe0cbfc0 0000002c 00001d80 0xb0c7c8c0: ff3303a8 00000000 b0c7c8f0 fe20d194 0xb0c7c8d0: 00c4f5e4 00000000 00000001 00000000 0xb0c7c8e0: 00000000 00000000 00000001 00c4f608 0xb0c7c8f0: fe0c77d2 00000076 00000065 00007200 0xb0c7c900: 00000072 96898d9b ffffffff 00000000 Instructions: (pc=0xff380700) 0xff3806f0: d8 5e 60 30 da 5e 60 38 d6 f6 20 20 d8 f6 20 28 0xff380700: d4 5e 60 40 d6 5e 60 48 da f6 20 30 d4 f6 20 38 Stack: [0xb0c00000,0xb0c80000], sp=0xb0c7c890, free space=498k Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) C [libc_psr.so.1+0x700] memcpy+0x2f8 C [libzip.so+0xd19c] C [libzip.so+0x2380] ZIP_GetEntry+0xe4 C [libzip.so+0x2800] Java_java_util_zip_ZipFile_getEntry+0xc4 j java.util.zip.ZipFile.getEntry(JLjava/lang/String;Z)J+0 j java.util.zip.ZipFile.getEntry(JLjava/lang/String;Z)J+0 j java.util.zip.ZipFile.getEntry(Ljava/lang/String;)Ljava/util/zip/ZipEntry;+31 j java.util.jar.JarFile.getEntry(Ljava/lang/String;)Ljava/util/zip/ZipEntry;+2 j java.util.jar.JarFile.getJarEntry(Ljava/lang/String;)Ljava/util/jar/JarEntry;+2 ... 위와 비슷한 내용이 보인다면


원인

JVM 충돌


해결하기

가장 흔한 이유는 아래 2가지가 있습니다.

1. 기기의 SWAP 공간이 부족

2. JVM에서 해당 JAR 파일이 사용중일때 JAR 파일이 수정되거나 덮어쓰여졌을 경우, JAR 파일이 손상됐다고 판단.


1번의 이슈같은 경우는 논외로 하겠습니다.


2번의 이슈가 거의 대부분인데 이유는 아래와 같습니다.

JVM은 성능향상을 목적으로 JAR 파일의 central directory structure(mmap를 사용하여)를 캐싱합니다. 

central directory는 JAR파일의 내용(엔트리 주소, 사이즈같은)을 담고있는데 그것을 캐싱한다는 것은 매번 JAR파일의 엔트리를 사용할때마다 디스크 에서 읽는것을 없애줍니다.  


그런데 만일 JAR파일이 수정되었다면 JAM의 central directory는 더이상 정확한 정보를 가지지 못하게되고 결과적으로 수정된 JAR파일에서 엔트리를 로딩하려 할때 SIGBUS나 SIGSEGV를  발행하게됩니다.


참고 : 1.6.0_23 부터 ZIP/JAR 파일에 대하여 메모리 매핑을 사용하지않는 명령행 옵션이 추가되었습니다.


-Dsun.zip.disableMemoryMapping=true


상기 옵션을 사용하게 되면 성능에 영향을 끼치게되는데 이유는 VM이 매번 JAR의 엔트리를 사용할때마다 추가적인 디스크 IO가 발생되기때문입니다(central directory structrure 를 알아내기 위하여).


가급적 새롭게 JAR파일을 배포하게되면 해당 JAR파일을 사용하여 실행되고 있는 프로세스를 재시작하는것을 추천합니다.


참고

http://www-01.ibm.com/support/docview.wss?uid=swg21625858

http://bugs.sun.com/view_bug.do?bug_id=7129299  

Posted by 빨강토끼
,

http://winmerge.org/downloads/plugins.php


에서


xdocdiff Plugin 을 다운 받으시면


doc, xls, ppt, pdf 등의 파일의 내용을 비교할수 있습니다.

1. 압축을 풀어줍니다.
2. xdoc2txt.exe 와 zlib.dll 를 WinMerge program folder에 복사합니다. ( WinMerge.exe 이 위치한곳)

3. MergePlugins 폴더를 그대로 WinMerge program folder 아래로 복사합니다.

4. winmerge를 실행합니다.

5. 플러그인 메뉴 > 자동언팩을 선택합니다.



고맙습니다.

Posted by 빨강토끼
,

DB서버 리부팅후 oracle 에 접속을 하려고 하면

아래와 같은 메시지가 나오면서 접속이 안될때가 있습니다.


ERROR:

ORA-01034: ORACLE not available

ORA-27101: shared memory realm does not exist 

Linux Error: 2: No such file or directory


오라클이 비정상 종료로 인한문제라고 합니다.

nolog 로 접속하여 startup 해주면 되는데

방법은 아래와 같습니다.


[db]# sqlplus /nolog

SQL> conn sys/ as sysdba

...

SQL>startup

...

...

Database mounted.


그런데 이러고 나서 접속을 하려고 하면

또다시 아래와 같은 메시지가 나오면서 접속이 안될때가 있습니다.


ora-12541 tns 리스너가 없습니다


oracle만 실행되고 리스너가 실행안된경우입니다.


리스너 상태를 살패본후 리스너가 만일 구동중이 아니면 리스너를 start 해주면 됩니다.


[db]# lsnrctl

LSNRCTL>status


Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))

TNS-12541: TNS:no listener

 TNS-12560: TNS:protocol adapter error

  TNS-00511: No listener

   Solaris Error: 146: Connection refused

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=DB서버명)(PORT=1521)))

TNS-12541: TNS:no listener

 TNS-12560: TNS:protocol adapter error

  TNS-00511: No listener

   Solaris Error: 146: Connection refused


위와 같이 나오면 리스너가 실행되지 않고 있는것 입니다.

start 해주시면 됩니다.


LSNRCTL>start



Posted by 빨강토끼
,

충동알림창에서 Start MergeTool to resolve conflicts을 선택하여 MergeTool을 통해 수정하거나, 충돌이 일어난 파일을 수동을 찾아 직접 수정하여 충돌 해결


Project의 Team Menu->Add to Index 선택 


Project의 Team Menu -> Rebase -> Continue Rebaes 선택 



Posted by 빨강토끼
,

sublime text 을 사용하고 있습니다.

그런데 txt 문서들을 열고 이런저런 작업을 하고 새로편집창을 열어 이런저런 작업을 한후에

sublime text 를 닫으면 수정하거나 새로만든 화일들의 저장여부를 묻지도 않고 닫혀버립니다.

이기능을 sublime text 에서는 hot_exit 라고 하는데 저는 아직 익숙하지가 않아서

sublime text 를 닫을때 그런화일들의 저장여부를 확인했으면해서 인터넷을 찾아봤습니다.


Preferences.sublime-settings 에서

"hot_exit": false,

이라고 입력하고 저장하면 제가 바라는 기능이 동작됩니다.



Posted by 빨강토끼
,