<< 6월 2008 | | 8월 2008 >>

Java I/O Performance 성능 향상 코딩

Sun Website의 아티클을 가지고 테스트 프로그램을 만들어 어느것이 성능이 좋은 코딩 방법인지 실제 테스트를 해 보았습니다.

copyEx1() 함수는 Raw File Stream형태의 방식을 구사하여 제일 늦게 나왔고, 그 다음으로 copyEx2() 함수는 Buffered Streams을 사용해서 파일 카피를 했습니다. 이게 가장 많이 사용하죠. 대부분의 개발자들이 무의식적으로 이 방법을 사용합니다. ^^ 이것 보다 나은 방법이 있습니다.
copyEx3, ,4 5() 함수는 Custom Buffer 방식인데 copyEx3() 함수는 멀티 쓰레드 방식에서 사용 가능합니다. 그리고 가장 성능이 우수하다는 걸 실행 결과를 보면 아실 것입니다. 그리고 멀티 쓰레드 방식일 경우에는 병목현상이 발생하니 synchronized 코드를 잘 활용하세여.
copyEx4()는 일반 버퍼를 사용한 경우입니다. copyEx5()는 Buffered Streams 방식을 추가해 보았는데 3,4보다는 성능이 떨어지는 것을 확인할 수 있습니다.

아래는 성능 테스트를 한 소스입니다.

1. 테스트 소스

package client;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class CopyExamples
{
// Thread buffer size
private static final int BUFF_SIZE = 1024 * 4;
private static final byte[] buffer = new byte[BUFF_SIZE];


// Thread buffer variable
private static final ThreadLocal<byte[]> buffCache =
new ThreadLocal<byte[]>()
{
@Override
protected byte[] initialValue() {
return new byte[BUFF_SIZE];
}
};

private CopyExamples()
{
}

public static void copyEx1(String from, String to) throws IOException
{
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(from);
out = new FileOutputStream(to);
while (true) {
int data = in.read();
if (data == -1)
break;
out.write(data);
}
in.close();
out.close();
} finally {
if (in != null)
in.close();
if (out != null)
out.close();
}
}

// Buffered Streams
public static void copyEx2(String from, String to) throws IOException
{
InputStream in = null;
OutputStream out = null;
try {
InputStream inFile = new FileInputStream(from);
in = new BufferedInputStream(inFile);
OutputStream outFile = new FileOutputStream(to);
out = new BufferedOutputStream(outFile);
while (true) {
int data = in.read();
if (data == -1)
break;
out.write(data);
}
} finally {
if (in != null)
in.close();
if (out != null)
out.close();
}
}


public static void copyEx3(String from, String to) throws IOException
{
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(from);
out = new FileOutputStream(to);
byte[] buffer = buffCache.get();
int amountRead;
while ((amountRead = in.read(buffer)) != -1) {
out.write(buffer, 0, amountRead);
}
} finally {
if (in != null)
in.close();
if (out != null)
out.close();
}
}

public static void copyEx4(String from, String to) throws IOException
{
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(from);
out = new FileOutputStream(to);
while (true) {
synchronized (buffer) {
int amountRead = in.read(buffer);
if (amountRead == -1) {
break;
}
out.write(buffer, 0, amountRead);
}
}
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}


public static void copyEx5(String from, String to) throws IOException
{
InputStream in = null;
OutputStream out = null;
try {
InputStream inFile = new FileInputStream(from);
in = new BufferedInputStream(inFile);
OutputStream outFile = new FileOutputStream(to);
out = new BufferedOutputStream(outFile);
byte[] buffer = buffCache.get();
int amountRead;
while ((amountRead = in.read(buffer)) != -1) {
out.write(buffer, 0, amountRead);
}
} finally {
if (in != null)
in.close();
if (out != null)
out.close();
}
}

public static void main(String[] args)
{
try {
long start1 = System.currentTimeMillis();
CopyExamples.copyEx1("D:\\temp\\march.pdf",
"D:\\temp\\march1.pdf");
System.out.println("copyEx1 Duration : " +
(System.currentTimeMillis() - start1));

long start2 = System.currentTimeMillis();
CopyExamples.copyEx2("D:\\temp\\march.pdf",
"D:\\temp\\march2.pdf");
System.out.println("copyEx2 Duration : " +
(System.currentTimeMillis() - start2));

long start3 = System.currentTimeMillis();
CopyExamples.copyEx3("D:\\temp\\march.pdf",
"D:\\temp\\march3.pdf");
System.out.println("copyEx3 Duration : " +
(System.currentTimeMillis() - start3));

long start4 = System.currentTimeMillis();
CopyExamples.copyEx2("D:\\temp\\march.pdf",
"D:\\temp\\march4.pdf");
System.out.println("copyEx4 Duration : " +
(System.currentTimeMillis() - start4));

long start5 = System.currentTimeMillis();
CopyExamples.copyEx2("D:\\temp\\march.pdf",
"D:\\temp\\march5.pdf");
System.out.println("copyEx5 Duration : " +
(System.currentTimeMillis() - start5));
} catch (Exception e) {
System.out.println(e);
}
}
}
2. 실행 결과

copyEx1 Duration : 8531
copyEx2 Duration : 109
copyEx3 Duration : 16
copyEx4 Duration : 94
copyEx5 Duration : 109
태그 :

온라인에서 많이 뜨는 용어 42

1. 소비시장의 Big Mouth, 「마켓 메이븐(Market Mavens)」
 - 메이븐은 ‘지식을 축적한 자’, ‘숙련자’ 라는 뜻입니다. 마켓 메이븐은 다양한 제품, 상점, 서비스 등에 대한 다양한 정보를 수집하고 자신들의 경험이나 지식을 다른 사람들에게 전파하는 발신자 역할을 합니다.

2. 「라이프 캐싱(Life Caching)」
 - 라이프 캐싱(Life Caching)은 블로그, 미니홈피 등 디지털 매체를 통해 사소한 일도 타인과 공유하려는 행위로 이를 하는 사람을 라이프 캐싱족이라고 합니다. 남에게 인정받기 위해 강한 자기 표현 욕구를 갖고 있는 컨텐츠 세대를 위해 양방향 자서전 대필업체인 바이오라이터나 시민기자 형식을 도입한 오마이뉴스 등이 라이프 캐싱의 대표적 사례라고 할 수 있다고 하네요.

3. 「다운시프트(Downshifts)족」
 - 다운시프트족은 비록 저소득일지라도 여유있는 직장생활을 즐기면서 삶의 만족을 찾으려는 사람들을 지칭하는 용어입니다. 최근 웰빙 시대를 맞이하여 다운시프트족은 점점 늘어나고 있는 추세라고 합니다.

4. 「WLB(Work Life Balance)」
 - WLB는 "일과 생활의 균형"을 뜻하는 용어로 근로자가 일과 생활을 모두 잘한다고 느끼는 상태를 말합니다. 기업에 있어 WLB이 궁극적인 목표는 변화된 경쟁 환경 속에서 종업원과 회사가 함께 윈윈 체제를 구축하는 것인데 아직 우리나라는 기업이 우선인 문화가 형성되어 있어 가족을 등한시하는 직장인들이 대부분입니다. 어서 이런 문화가 없어지고 WLB가 주류가되는 환경이 되어야 할텐데요.

5.  「미니플래너(Minipreneur)」
 - 미니플래너는 작음을 나타내는 "Mini"와 기업가를 의미하는 "Entrepreneur"를 조합한 것으로 이베이, G마켓 등을 통해 온라인 사업을 하는 소규모 사업자를 통칭해 부르는 용어입니다. 미국에는 약 72만명이 이베이를 통해 소규모 온라인 사업을 하고 있다고 합니다. 저희 나라도 많죠.

6. 소비 스타일 트렌드
 - 「알뜰족」 : 할인쿠폰, 할인점 등을 이용하여 생활비를 아끼며 규모 있게 생활
 - 「하이제니아(Hygienia)족」 : 제품 사용 리뷰와 제품 전문가의 뉴스레터 등의 정보를 통해 저비용 고품질 상품, 또는 혁신적인 상품과 서비스를 중시하는 합리적이고 분석적인 소비자
 - 「위버프리미엄(Uber premium)족」 : 0.1%를 위한 차별화된 고급화를 추구하는 소비자

7. 「퍼블리즌(Publizen)」
 -  퍼블리즌은 ‘공개(Publicity)’와 ‘시민(Citizen)’을 결합한 신조어로 글, 사진, 동영상 등으로 인터넷을 통해 자신의 끼와 생각을 일반인에게 적극적으로 홍보하는 사람들을 말합니다.

8. 「내로캐스팅(narrowcasting)」
 - 최근 시간에 구애 받지 않고 소수가 시청하는 내로 캐스팅(narrowcasting:협송)이 그 영역을 넓혀가고 있습니다. 국내에는 하나로텔레콤의 ‘하나TV’, KT의 ‘메가TV’, 그래텍의 ‘곰TV’ 등 케이블TV·인터넷방송과 ‘판도라TV’, ‘엠군’ 등 동영상UCC·1인 인터넷 방송 사이트가 있답니다.

9. 「프리미엄(freemium)」
 - 프리미엄(freemium)은 무료 서비스를 통해 이용자를 끌어들인 후 부가기능을 유료화하여 수익을 창출하는 서비스를 말합니다. 어도비(Adobe)의 PDF리더, 매크로미디어(Macromedia)의쇽웨이브 플레이어(Shockwave Player)가 대표적인 예입니다. 웹2.0 시대를 맞은 요즘은 이용자들이 다른 사람들에게 제품 및 제품의 평가에 대해 다른 사람들에게 전파하는 경우가 많아지기 때문에 프리미엄(freemium)서비스가 더욱 증가하는 추세입니다. 잘못하면 소비자에게 욕 먹죠.

10. 「데카르트(tech+art) 신드롬」
 - 최근 가전 제품에 감성과 예술적 요소를 강조한 ‘데카르트 신드롬’이 확산되고 있습니다. 데카르트는 기술(tech)과 예술(art)를 합성한 신조어로 첨단 가전제품에 소비자들의 오감을 만족시킬 수 있는 디자인과 기능성을 구현한 것을 일컫는답니다.

11. 「무용지식(Obsoledge, obsolete+knowledge)」
 - 무용지식(Obsoledge)은 무용한(obsolete)과 지식(knowledge)을 합성한 단어로 ‘부의 미래’에서 ‘앨빈 토플러’가 말한 신조어 입니다. 모든 지식에는 한정된 수명이 있으며, 정보의 홍수 속에 쏟아져 나오는 쓰레기 지식을 ‘무용 지식’이라고 부르고 있습니다. 또한 지식이 무용지식으로 바뀌는 속도 역시 빨라지고 있어 끊임없는 공부와 지식 업데이트가 없다면 직장생활을 통해 쌓은 경력의 가치도 줄어들고 마는 세상이라고 해서 무지 중요한 용어로 자리잡고 있죠. 비슷한 용어로 셀러던트가 있죠.

12. 「노블레스 노마드(Noblesse Nomad)」
 - 노블레스 노마드는 귀족적 유목민이란 뜻으로 명품 등 물건을 소유하기 보다 여행, 레저, 공연 관람 등 무형의 경험을 중시하는 새로운 소비자층을 말합니다. 이들은 비싼 물건으로 신분을 과시하는 겉치레 문화를 거부하는 대신 자신이 하고 싶고, 누리고 싶은 경험적인 일에 아낌없이 투자하는 경향이 있답니다.

13. 「블루슈머」
 - 블루슈머란 경쟁자가 적은 시장을 의미하는 블루오션(Blue Ocean)과 소비자(Consumer)를 합성한 단어로 기업 경쟁이 치열하지 않은 새로운 소비 계층을 뜻합니다. 

14. 「브랜드 하이재킹(brand hijacking)」
 - 브랜드 하이재킹(brand hijacking)은 기업이 상품 마케 팅을 이끌고 통제하는 대신 소비자가 브랜드 개발에 참여하고 주도하는 것을 말합니다. 소비자가 비즈니스 최전선에서 브랜드를 스스로 진화시켜 나가는 또 하나의 마케터 집단이 되는 것이라고 합니다.

15. 「위키노믹스(Wikinomics)」
 - 위키노믹스(Wikinomics)는 인터넷 이용자들이 만든 무료 백과사전' 위키피디아(wikipedia)'와 경제를 뜻하는 '이코노믹스(economics)'를 합성한 말입니다. 웹 2.0 이념을 대표적으로 구현한 위키피디아는 수백만 또는 수십억의 '집단지성'을 조직하고 활용하고 있습니다. 이러한 집단지성이 지구 전체를 거대한 두뇌로 변모시키고, 과거 어떤 생산양식보다 훨씬 더 큰 가치를 만들어 낼 수 있다는 것이 바로 위키노믹스의 철학입니다.

16. 「프리젠티즘(Presenteeism)」

 - 프리젠티즘이란 회사에 출근은 했지만 질병이나 스트레스로 인해 정상적인 업무를 수행할 수 없는 현상을 뜻합니다. 최근 로이터통신은 "미국 기업의 56%가 아픈 걸 참고 출근하는 직원들로 인해 골머리를 앓고 있으며, 이로 인한 손해가 매년 1800억달러(170조원)에 이르는 것으로 추산됐다"라고 보도했습니다.

17. 「발룬투어리즘(Voluntourism)」
 - 발룬투어리즘은 자선·봉사활동을 뜻하는 '발룬티어(volunteer)'와 여행을 의미하는 '투어리즘(tourism)'이 결합된 신조어로, 휴가를 자선활동으로 보내는 것을 말합니다. 이런 현상은 9.11이나 허리케인 카트리나 사태, 인도네시아 쓰나미 참사 등을 통해 전세계적으로 나눔의 기쁨이 사람들의 소중한 삶의 가치로 확산되고 있기 때문이라고 합니다.

18. 「크라우드 클라우트(CROWD CLOUT)」

 - 크라우드 클라우트는 소비자들이 인터넷에서의 집단 행동을 통해 사회나 시장에 특별한 변화를 주는 영향력을 말합니다. 예를 들어 특정 정치인을 선거에서 떨어뜨리거나, 공급자가 시장에서 제시하는 가격을 낮추는 단체행위에서 크라우드 클라우트를 찾아볼 수 있는데요. 이에 따라 기존의 소비자와 공급자간의 관계가 바뀌면서, 소비자들이 자신의 니즈를 밝히면 공급자들은 그를 충족시키기 위해 시장에서 경쟁하고 있습니다.

19. 「홈퍼니(Homepany)」
 - 홈퍼니(Homepany)란 ‘집(Home)’과 ‘회사(Company)’의 합성어로 직원들에게 다양한 복지혜택을 제공하는 등 ‘가족친화경영’을 실천하는 회사를 말합니다. 인터넷기업 ‘구글(Google)’이 대표적인 홈퍼니의 사례로 꼽힙니다.

20. 「스플로거(Splogger)」
 - 스플로거(Splogger)는 ‘스팸(Spam)'과 '블로거(Blogger)’의 합성어로 타인의 콘텐츠를 무단으로 복사해와 자신의 블로그에 게재하는 블로거를 말합니다. 이를 통해 자신의 블로그를 검색엔진 상위에 랭크시킨 다음, ‘키워드 검색광고’ 등을 통해 많은 수익을 얻기도 하죠.

21. 「디지털 치매(Digital Dementia)」
 - '디지털 치매'는 휴대폰·컴퓨터 등 디지털 기기에 지나치게 의존한 나머지 기억력과 계산 능력이 크게 떨어진데다 과다한 정보 습득으로 인해 각종 건망증 증세가 심해진 상태를 뜻하는 신조어입니다.

22. 「엠니스(M-ness)족」
 - 엠니스(M-ness)족은 남자를 뜻하는 ‘Man’과 성질·상태를 나타내는 접미사 ‘ness’를 합쳐 만든 신조어로, 힘·명예 등으로 대표되는 전통적인 남성상과 구별되는 ‘신남성’을 뜻합니다. 이들은 권력과 명예 등 남성적 특성과 육아, 협력 같은 여성적 특성을 두루 갖추고 있습니다.

23. 베블렌 효과(Veblen Effect)
 - 베블렌 효과(Veblen Effect)란 가격이 비쌀수록 오히려 수요가 늘어나는 비합리적 소비현상을 뜻합니다. 흔히 고가의 귀금속이나 고급 자동차 등은 경제상황이 나빠지더라도 그 수요는 줄지 않는 경향이 있는데, 이는 자존심과 교육수준이 높은 젊은 세대를 중심으로 하이클래스적인 이미지를 얻기 위해 무리를 해서라도 고가품을 구입하려 하기 때문이죠.

24. 인포메이션 캐스케이드(Information Cascade)
 - 인포메이션 캐스케이드(Information Cascade)는 정보가 폭포처럼 쏟아져 나오면서 원하는 정보를 찾기가 점점 어려워짐에 따라 개인들이 다른 사람들의 결정을 참고해 자신의 의사를 결정하는 현상을 말합니다. 예를 들어 인터넷에서 물건을 구매할 때 다른 고객들이 어떤 제품을 주로 구매했는지를 참고해서 ‘따라하기’ 식의 구매를 하거나, 주식투자나 외환거래 등 금융거래 시 리스크를 줄이기 위해 다른 사람의 동향에 관심을 갖는 등의 행동을 보입니다.

25. 아티젠(Arty Generation)
 - 최근 들어 새로운 소비계층으로 아티젠이 부각되고 있습니다. 아티젠은 Arty와 Generation의 합성어로 상품의 기능적인 측면뿐 아니라 예술이 결합된 아트디자인을 선호하며 세련되고 예쁜 디자인의 수준을 넘어 디자이너 혹은 예술가가 주는 고유의 디자인과 퍼스낼러티를 중시하는 소비자를 의미합니다. 최근 들어 백화점, 쇼핑몰 등에서는 새로운 소비계층인 아티젠을 겨냥한 다양한 마케팅에 나서고 있답니다.

26. 체리피커(Cherry Picker)
 - 체리피커(Cherry Picker)란 신 포도 대신 체리만 골라먹는 사람이라는 뜻으로, 기업의 상품이나 서비스를 구매하지 않으면서 기업이 제공하는 혜택을 누리는 소비자를 말합니다. 예를 들어 상품이나 서비스를 잠시 동안 사용하기 위해 주문했다가 반품하거나, 신용카드를 쓰지 않으면서 카드사의 할인서비스는 이용하는 행위를 하곤 합니다.

27. 이터테인먼트(Eatertainment)
 - 이터테인먼트(Eatertainment)는 '먹고 마신다(eat)'와 '즐긴다(entertainment)'의 합성어로, 말 그대로 먹으면서 즐기는 문화를 뜻합니다. 예를 들어 레스토랑에서 식사만 하는 것이 아니라 다채로운 공연이나 게임 등을 동시에 즐기는 것을 말합니다. 최근 이터테인먼트 산업은 IT 기술을 적극 도입, 온라인 게임은 물론 TV 시청, 영화 감상 서비스도 함께 제공하여 소비자들에게 색다른 재미를 선사하고 있습니다.

28. 캔비족(Canbe 족)
 - 캔비족(Canbe 족)은 'Can be(될 수 있다)'에서 나온 신조어로, 유명 인사의 옷과 액세서리 등 패션을 모방하여 자신을 이들과 동격화하려는 사람들을 말합니다. 최근 한 취업 관련 사이트의 조사에 따르면, 설문대상인 대학생 380명 중 55%가 '캔비족'의 성향을 가지고 있는 것으로 답했다고 합니다.

29. 헬스 테크(Health Tech)
 - 헬스 테크(Health Tech)는 헬스 테크놀로지(Health Technology)의 줄임말로, 건강한 노후생활을 대비하기 위한 노력을 뜻하는 말입니다. 전문가들은 고령화사회에서 젊을 때부터 노후생활자금 마련을 위해 재테크를 열심히 하듯이, 건강을 유지하고 노화를 방지하는 헬스 테크를 통해 노후 의료비를 절약하는 등 장기적으로 더 많은 이익을 기대할 수 있다고 합니다.

30. 프루브족(PRUV족)
 - 프루브족(PRUV족)은 ‘희소가치를 자랑스럽게 실현하는 사람(Proud Realisers of Unusual Value)’이란 뜻으로, 잘 알려지지 않은 브랜드 또는 알아도 쉽게 구하기 힘든 브랜드 제품을 구매함으로써 남들과 차별화하려는 소비자들을 말합니다. 최근 해외여행과 해외구매대행 서비스가 증가하면서 희귀한 브랜드를 찾는 프루브족이 늘고 있다고 합니다.

31. 콘크리트 소비자(Concrete Consumer)
 - 콘크리트 소비자(Concrete Consumer)란 외부 충격에 반응이 없는 콘크리트의 속성을 지닌 소비자를 빗댄 표현으로, 기업의 브랜드 커뮤니케이션 활동에 갈수록 무감각해지고 있는 현대 소비자를 의미합니다. 미국의 한 연구조사에 따르면 소비자가 접하는 광고 메시지는 하루에 2,500여 개이고, 시청자의 9%만이 방금 TV에서 본 브랜드를 기억하는 등 소비자의 마케팅 저항이 점차 심화되고 있습니다.

32. 쇼플러(Shoppler)
 - 쇼플러(Shoppler)는 물건구매를 뜻하는 쇼핑(Shopping)과 여행자를 뜻하는 트래블러(traveler)를 합성한 말로, 자신이 마음에 드는 물건을 사기 위해서 전 세계로 여행을 떠나는 소비자들을 말합니다. 한국은행의 자료에 따르면 2007년 해외로 출국한 1,300여만명의 지출액이 100조원을 넘는 등, 이제 쇼핑을 빼놓고는 해외여행을 설명할 수 없는 시대가 되었습니다.

33. 몰링족(Malling 족)
 - 몰링족(Malling 족)은 대형 복합쇼핑몰에서 쇼핑, 놀이, 공연, 교육 등을 원스톱(One Stop)으로 해결하는 것을 뜻하는 '몰링(Malling)'을 즐기는 새로운 소비계층을 일컫는 말입니다. 최근 전세계적으로 쇼핑시설과 함께 영화관, 공연장, 레스토랑 시설을 함께 갖추고 있는 복합 쇼핑몰이 증가 하고 있고, 소비자들이 쇼핑 자체를 단순히 물건을 사는 행위를 넘어서 하나의 즐거운 경험으로 여기면서 몰링족이 늘어나고 있는 추세입니다.

34. 컬처노믹스(Cultunomics)
 - 컬처노믹스(Cultunomics)는 문화(culture)와 경제(economics)의 합성어로, 기업이나 공공기관 등에서 ‘문화를 경제적으로 활용하는 현상’을 뜻하는 말입니다. 최근 기업들은 국내ㆍ외 유명 예술작가나 작품을 소재로 상품의 철학을 광고하거나 음악회를 개최하는 등 문화콘텐츠를 비즈니스에 적극적으로 활용하고 있습니다.

35. 오피스 코쿤족(Office Cocoon족)
 - 오피스 코쿤족(Office Cocoon족)은 사무실을 뜻하는 '오피스(Office)'와 누에고치를 뜻하는 '코쿤(Cocoon)'의 합성어로, 회사 사무실의 자기 자리를 집처럼 꾸미는 20~30대 직장인들을 일컫는 말입니다. 주 5일제 확산으로 인해 직장인들의 평일 업무 강도가 높아지고 근무 시간도 늘면서, 사무실을 내집처럼 꾸미는 오피스 코쿤족이 늘어나고 있답니다.

36. 인스피리언스(insperience족)
 - 인스피리언스(insperience족)은 집안을 뜻하는 영어 ‘Indoor'와 경험을 뜻하는 ’Experience‘가 결합된 말로 밖에서 즐기던 경험을 집안으로 끌어들이는 소비자들을 말합니다. 인스피리언스족은 집을 단순히 머무는 공간이 아니라 즐기는 공간으로 재창조하기 위해 홈시어터, 홈바, 헬스장, 홈사우나 등을 꾸며놓고 자신만의 삶을 즐깁니다.

37. 셀리켓(celliquette)
 -  셀리켓(celliquette)은 휴대폰(cell phone)과 에티켓(etiquette)의 합성어로 지하철 등 공공장소에서의 휴대폰 사용 에티켓을 뜻하는 신조어입니다. 우리나라는 세계 최고 수준의 휴대전화 기술과 디자인 실력을 자랑하고 있지만 휴대폰을 사용하는 시민문화는 세계 최고 수준과는 거리가 있는 것이 현실인데요. 특히 지하철에서 큰 목소리로 통화하는 것은 물론이고 최근에는 DMB 시청, 게임 등을 이어폰 없이 휴대폰 스피커로 듣는 사람들도 꽤 많이 볼 수 있습니다.

38. 그린 컨슈머(Green Consumer)
 - 그린 컨슈머(Green Consumer)는 다음 세대의 환경을 생각하며 친환경제품 및 유기농 등을 선호하는 소비자를 뜻하는 말입니다. 친환경 요소를 소비의 기준으로 삼는 그린 컨슈머는 최근 유럽, 일본 등 선진국에서 막강한 소비력를 보이고 있으며, 국내 창업전문가들을 대상으로 한 설문조사에서 향후 가장 인기를 끌 업종으로 친환경, 웰빙매장이 선정되는 등 그린 컨슈머에 대한 관심이 점차 커져가고 있습니다.

39. 블룩(blook: blog+book)
 - 블룩이란 블로그와 북의 합성어로 개인이 블로그에 연재한 글을 모아 출판한 책을 지칭하는 신조어입니다. 블룩은 일상에서 활용할 수 있는 생생한 생활 노하우 등이 담겨있고, 온라인을 통해 1차적으로 독자들의 반응을 검증받았기 때문에 출판시장에서 높은 인기를 누리고 있습니다. ‘비즈니스 위크’에 따르면 미국에서는 책으로 묶을 만한 블로그를 탐색해주는 블룩 전문업체도 생겼다고 합니다.

40. 메타버스(Metaverse)
 - 메타버스(Metaverse)는 현실의 세계를 의미하는 '유니버스(Universe)'와 ‘가공, 추상'을 의미하는 '메타(Meta)'의 합성어로 3차원 가상세계를 뜻합니다. 미국 IT 벤처기업인 린든랩이 만든 세컨드라이프(Second Life)의 인기가 증가하면서 메타버스에 대한 관심도 덩달아 높아지고 있습니다.

41. 샹그릴라 신드롬(Shangri-La Syndrome)
 - 미국 작가 제임스 힐튼의 소설 '잃어버린 지평선'에 나오는 '샹그릴라'는 히말라야 산중의 작은 마을로, 평생 늙지 않고 영원한 젊음을 누릴 수 있는 가상의 지상 낙원을 뜻합니다. 최근 시간적인 여유와 경제적인 풍요를 가진 시니어 계층을 중심으로 단조롭고 무색무취한 삶의 틀을 깨고, 젊게 살아가고자 하는 노력을 통틀어 '샹그릴라 신드롬(Shangri-La Syndrome)'이라고 부릅니다.

42. 뉴로 마케팅(Neuro marketing)
 - 뉴로 마케팅(Neuro marketing)은 뇌신경(neuro) 과학과 마케팅을 접목시켜 보다 과학적으로 소비자들의 소비 패턴을 분석해 마케팅에 활용하는 새로운 마케팅 기법을 말합니다. 많은 기업들이 소비자의 속마음을 알기 위해 과학적인 조사 기법으로서 뉴로 마케팅에 주목하고 있습니다.

[참고 : 세리 온라인 폴]
태그 :

8가지 자동 완성 Ajax Scripts

1. jqac
 - jQuery를 활용한 Auto-complete/suggest javascript 라이브러리
 - 다운로드 : http://code.google.com/p/jqac/downloads/list
 - 데모 : http://www.cs.bgu.ac.il/~ygleyzer/files/utils/jqac/jqac_example.html

2. AutoComplete 1.2
 - prototype과 scriptaculous를 활용한 Auto-complete javascript 라이브러리
 - 다운로드 : http://www.beauscott.com/examples/autocomplete/autocomplete.zip
 - 데모 : http://www.beauscott.com/examples/autocomplete/doc/examples.html
 
3. AutoCompleter(mootools)
 - MooTools를 활용한 Auto-complete javascript 라이브러리
 - 다운로드 : http://digitarald.de/project/autocompleter/#download
 - 데모 : http://digitarald.de/project/autocompleter/1-1/showcase/delicious-tags/, http://digitarald.de/project/autocompleter/1-1/showcase/local/

4. AJAX AutoComplete
 - Jim Roos가 자체로 만든 Ajax framework
 - 다운로드 : http://jimroos.com/AutoComplete.zip
 - 데모 : http://www.jimroos.com/2007/05/ajax-autocomplete.html

5. YUI Autocomplete
 - Yahoo! UI Library로 만든 Auto-complete
 - 다운로드 : http://brandspankingnew.net/download.php?file=autosuggest_v2.zip
 - 데모 : http://developer.yahoo.com/yui/examples/autocomplete/index.html

6. AutoSuggest
 - 심플한 Javascript를 활용한 Auto-complete
 - 다운로드 : http://www.brandspankingnew.net/specials/ajax_autosuggest/ajax_autosuggest_autocomplete.html
 - 데모 : http://www.brandspankingnew.net/specials/ajax_autosuggest/ajax_autosuggest_autocomplete.html

7. dhtmlxCombo
 - 콤보형 Auto-complete
 - 다운로드 : http://www.dhtmlx.com/docs/download/dhtmlxCombo.zip
 - 데모 : http://dhtmlx.com/docs/products/dhtmlxCombo/index.shtml

8. AutoComplete (mootools)
 - scriptaculous를 활용한 Auto-complete
 - 다운로드 : http://script.aculo.us/
 - 데모 : http://demo.script.aculo.us/ajax/autocompleter

나만의 UCC 사이트 구축하기

자신만의 UCC 사이트를 구축하기 위해서 필요한 프로그램들을 나열하고 이들의 용도와 설치 방법, 사용 방법을 설명함으로써 동영상 사이트 만드는데 도움을 주고자 이글을 적습니다.

1. FFmpeg란?
FFmpeg은 stream audio와 video를 스트리밍하고, 레코딩하고, 컨버팅하는 오픈소스 솔루션입니다. 여기에는 또한 libavcodec라는 우수한 audio/video 라이브러리를 내장하고 있습니다.
거의 대부분의 OS에서 컴파일되므로 활용이 가능하다는 장점이 있죠.
ffplay multimedia player를 내장도 하고 있습니다. ffserver라는 스트리밍 서버 기능도 있고 다양한 파일 포멧(AVI, MPEG, OGG, Matroska, ASF, …)과 인코딩 포멧(MPEG, DivX, MPEG4, AC3, DV, …)을 지원합니다.
간략하게 요역하자면 아래와 같습니다.

  • ffmpeg: 비디오 파일 포맷을 다른 포맷으로 변환할 수 있는 커맨드라인 툴. TV 수신 카드로부터 실시간 영상을 받아 인코딩할 수 있음
  • ffserver: HTTP 프로토콜을 사용하는 스트리밍 서버이다. 실시간 재생 도중 재생 위치 변경 기능을 제공함
  • ffplay: SDL과 ffmpeg 를 사용해서 구현된 간단한 재생 프로그램임
  • libavcodec: ffmpeg에서 사용하는 모든 오디오/비디오 코덱이 들어있는 라이브러리이다. 최고의 효율과 코드 재사용성을 목표로 만들어졌음
  • libavformat: ffmpeg에서 사용하는 모든 오디오/비디오 코덱을 파싱하고 생성하는 루틴들이 들어있는 라이브러리

2. 필요한 라이브러리
ffmpegFLV audio codec은 mp3이다. 그래서 오디오 변환을 위해서 LAME 이 필요하고 flv를 플레이하기 위해서는 다양한 Metadata가 필요하다. 그래서 FLVTool2가 필요합니다. FLVTool2는 루비를 설치해야만 합니다. ^^ 그리고 php로 운영하신다면 ffmpeg-php가 필요하겠죠.
마지막으로 플레이를 하기 위해서는 FlowPlayer를 다운받아서 활용하시는게 좋을 겁니다.
그럼 LAME->FFmpeg->Ruby->FLVTool2->FlowPlayer 순으로 설치를 하시면 됩니다.

 - LAME 설치
   . shell>wget http://downloads.sourceforge.net/lame/lame-398.tar.gz?
            modtime=1215212728&big_mirror=0
   . shell>./configure --enable-shared --prefix=/home/k2/server/lame;make;make install
 - FFMpeg 설치
   . shell>svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg
   . shell>cd ffmpeg
   . shell>./configure --prefix=/home/k2/server/ffmpeg
            --enable-gpl --enable-shared --enable-mp3lam;make;make install
   . 사용 방법 : ffmpeg -i "mimul.avi" -vcodec flv -f flv -r 29.97 -s 320×240
          -aspect 4:3 -b 300kb -g 160 -cmp 2 -subcmp 2 -mbd 2 -flags
          +aic+cbp+mv0+mv4+trell -ac 1 -ar 22050 -ab 56k "mimul_avi.flv"
 - Ruby
   . shell>wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p22.tar.bz2
   . shell>./configue --prefix=/home/k2/server/ruby;make;make install
 - FLVTool2
   . shell>wget
   . shell>ruby setup.rb config;ruby setup.rb setup;ruby setup.rb install
   . 사용방법 : RUBYLIB=lib ruby bin/flvtool2 -U <path to>/movie.flv
 - Flowplayer
   . http://flowplayer.org/download.html 사이트에서 파일을 다운 받음
   . 사용방법
<object type="application/x-shockwave-flash" data="[your site]/FlowPlayer.swf"
width="320" height="263" id="FlowPlayer">
<param name="allowScriptAccess" value="sameDomain"/>
<param name="movie" value="[your site]/FlowPlayer.swf"/>
<param name="quality" value="high"/>
<param name="scale" value="noScale"/>
<param name="wmode" value="transparent"/>
<param name="flashvars" value="baseURL=[base URL]&amp;videoFile=movie.flv
&amp;autoPlay=false&amp;loop=false&amp;autoBuffering=false
&amp;splashImageFile=movie.jpg"/>
</object>
[참조 사이트]
  • http://lame.sourceforge.net/
  • http://ffmpeg.mplayerhq.hu/
  • http://www.ruby-lang.org/
  • http://flowplayer.org/

iBatis를 사용해서 BLOB 객체 넣기

iBatis를 사용해서 오라클에 BLOB 객체 넣는 방법을 기술했습니다.

1. iBatis 설정

<!DOCTYPE sqlMap PUBLIC “-//ibatis.apache.org//DTD SQL Map 2.0//EN” 
“http://ibatis.apache.org/dtd/sql-map-2.dtd” >
<sqlMap namespace=”BLOB_SAMPLE” >
<insert id=”insert_blob” parameterClass=”java.util.HashMap” >
insert into BLOB_TABLE (
IMAGE)
values (
#IMAGE:BLOB#)
</insert>
</sqlMap>

2. SQLMapClient 매핑

// SQL map client instance
SQLMapClient sqlMapclient = ....

// 이미지 데이터 저장
byte[] image = user.getFile();

Map dataMap = new HashMap();
dataMap.put(“IMAGE”, image);

sqlMapClient.insert(“insert_blob”, dataMap);
태그 :

동물의 사랑은 영원하다 - Christian The Lion

아래의 동영상의 이해를 돕고자 간략하게 내용을 소개해드리겠습니다.
존 렌달과 에이스 버그라는 두 청년이 크리스챤이라는 아기 사자를 어릴때 키웠다고 합니다.하지만, 아기 사자는 그들이 보살필 수 없을 정도로 크게 자라서, 야생의 섭리를 유지하기 위해서 야생으로 돌려보내기로 결심했습니다.
몇년 후에 크리스챤을 보기 위해 아프리카로 두 청년이 여행을 떠났습니다. 모두들 크리스챤(사자)이 더 이상 그들을 기억하지 못할 거라고 했습니다.
그러나...아래의 동영상처럼 모든것을 기억하고 있는 크리스챤을 맞이하게 됩니다.

진정한 진심어린 마음은 영원이 간다는 것을 우리 인간들도 배웠으면 합니다. ^^

잠시만 기다려주세요. ^^
태그 :

SOAP Message Header에서 클라이언트 IP 조회

SOAP 서버의 보안 강화를 위해서 Authentication기능이나 IP Blocking 기능을 적용하여 접근 제어를 구현하게 되죠.
두가지 방법을 소개합니다.

1. Axis에서 handler 추가하기
 - 아래 소스를 handler에 추가하여 접속 클라이언트의 IP 정보를 조회할 수 있다.

import org.apache.axis.AxisFault;
import org.apache.axis.Message;
import org.apache.axis.MessageContext;
import org.apache.axis.message.SOAPEnvelope;
import org.apache.axis.transport.http.HTTPConstants;
import org.apache.axis.handlers.BasicHandler;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.servlet.http.HttpServletRequest;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPHeaderElement;
import javax.xml.soap.Name;
public class RemoteAddrHandler extends BasicHandler {
   protected final Log log = LogFactory.getLog(this.getClass());     
   public RemoteAddrHandler () {       
      log.info(“Creating RemoteAddress Handler”);   
   }    
   public void invoke(MessageContext msgContext)
     throws AxisFault {       
     Message requestMessage = msgContext.getRequestMessage();       
     HttpServletRequest req = (HttpServletRequest)
         msgContext.getProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST);      
     try {           
         String remoteAddr = req.getRemoteAddr();
         log.info(“REMOTE IP is : “ + remoteAddr);           
         SOAPEnvelope envelope = requestMessage.getSOAPEnvelope();
         SOAPHeaderElement header =
           requestMessage.getSOAPHeader().addHeaderElement(
           envelope.createName("AuthenticationInfo"));
         SOAPElement node = header.addChildElement("REMOTE-IP");
         node.addTextNode(remoteAddr);           
      } catch (SOAPException e) {           
         log.info(e.getMessage());       
      }    
   }
}

2.  Axis2에서는 inOut클래스에 적용하기

import org.apache.axis2.context.MessageContext;
String remoteAddress =
  (String)msgCtx.getProperty(MessageContext.REMOTE_ADDR):

두가지 방법을 고려하여 Client IP를 조회하여 블럭킹 기능을 적용하면 됩니다.

Soap Server 모니터링 하기

1. axis2.xml 편집
 - WEB-INF/conf/axis2.xml에 <module ref="soapmonitor"/> 한 라인 추가

2. web.xml 편집
 - WEB-INF/web.xml 아래 코드 추가
<servlet>
<servlet-name>SOAPMonitorService</servlet-name>
<display-name>SOAPMonitorService</display-name>
<servlet-class>org.apache.axis2.soapmonitor.servlet.
SOAPMonitorService</servlet-class>
<init-param>
<param-name>SOAPMonitorPort</param-name>
<param-value>5001</param-value>
</init-param>
<load-on-startup>100</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>SOAPMonitorService</servlet-name>
<url-pattern>/SOAPMonitor</url-pattern>
</servlet-mapping>

3. soapmonitor-1.4.jar의 SOAPMonitorApplet*.class 파일 풀기

 - DocumentRoot/ 폴더에 jar -xvf soapmonitor-1.4.jar 커맨드 실행하여 해당 Applet class파일들을 푼다

4. 모니터 결과 화면

OpenSessionInViewInterceptor 와 OpenSessionInViewFilter 예제

Spring Framework와 Hibernate를 연동해서 사용할 때는 many-to-one or one-to-one 관계에서 View단을 위해서 비즈니스 오브젝트를 렌더링하고자 lazy property와 함께 비즈니스 오브젝트를 위한 객체를 접근하게 되는데 이때 LazyInitializationException을 발생하는 경우가 생깁니다.
즉, 한 세션을 실행하다가 롤백을 하면 하이버네이트 트랜잭션 매니저가 현재 열려있는 세션을 바로 닫아버려 예외가 발생합니다.

그래서 Hibernate의 Lazy Loading을 사용하려면 꼭 OpenSessionInViewFilter나 OpenSessionInViewInterceptor를 적용해줘야 합니다.
그럼 OpenSessionInViewFilter와 OpenSessionInViewInterceptor중 무엇을 사용해야할 지 그 판단 기준은 무엇일까요?
하나는 fileter이고 하나는 interceptor인가요? ^^

Servlet Container가 2.3이거나 그 이후를 지원한다면 둘중에 아무거나 사용하셔도 되구요. 만약에 Servlet Container 2.2이후의 버전이라면 OpenSessionInViewInterceptor의 사용을 권장합니다.

1. OpenSessionInViewInterceptor

 - xxx-servlet.xml
<bean id="urlMapping"  
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
<list><ref bean="openSessionInViewInterceptor"/></list>
</property>
<property name="mappings">
</bean>
<bean name="openSessionInViewInterceptor"
class="org.springframework.orm.hibernate3.support.
OpenSessionInViewInterceptor">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>

2. OpenSessionInViewFilter
 - web.xml
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sessionFactory</param-value>
</init-param>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.html</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>

DNS 캐싱 식별 여부 확인 방법

1. Linux
 - root권한으로 ps - ef | grep nscd 해당 프로세스가 떠 있으면 /etc/nscd.conf 파일을 확인
 enable-cache passwd yes
 enable-cache group yes
 enable-cache hosts yes

- 캐싱안되게 할 경우

 enable-cache passwd no
 enable-cache group no
 enable-cache hosts no
 저장한 다음 /etc/rc.d/init.d/nscd restart 커맨드 실행
- 그외 /etc/resolv.conf, /etc/dnsmasq.conf에서 캐싱 여부를 판단하면 되고 캐싱 해제를 할 경우 리플레쉬를 해주면 됨

2. Window
 - HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DNSCache\Parameters 에서 MaxCacheTtl, MaxNegativeCacheTtl 값이 10으로 되어 있으면 10초 캐싱한다는 의미를 나타냄.
   (참고 사이트 : http://support.microsoft.com/kb/318803/ko)
 - 캐싱 안하게 할 경우는 레지스트리에서 0으로 하던가 아니면  net stop dnscache 명령어를 사용하거나 ipconfig /flushdns 커맨드를 사용함

3. 컴파일러
 - Java
  . $JAVA_HOME/jre/lib/security/java.security
  networkaddress.cache.ttl=10(또는 임의의 정수)
  설명) 네임 서비스로부터의 이름의 검색에 성공했을 경우의 캐싱 정책를 나타냄.
지정하는 값은, 성공한 검색 결과를 캐쉬하는 초수를 나타내는 정수.
-1의 값은, 「쭉 캐쉬한다」라고 하는 의미
  networkaddress.cache.negative.ttl=10
  설명) 네임 서비스로부터의 이름의 검색에 실패했을 경우의 캐싱 정책를 나타냄.
지정하는 값은, 실패한 검색 결과를 캐쉬하는 초수를 나타내는 정수.
0 의 값은, 「캐쉬하지 않는다」라고 하는 의미. -1 의 값은, 「쭉 캐쉬한다」라고 하는 의미.

  .어플리케이션에서 캐싱 설정한 경우

  java.security.Security.setProperty("networkaddress.cache.ttl" , "10");

 - 캐싱안하게 할 경우 ttl을 0으로 셋팅해주면 됨

태그 :

Java 기반의 이미지 업로드 및 Thumbnail 생성

Java기반의 이미지 리사이징하는 오픈 소스로는 Java Advanced Imaging (JAI), JMagick등이 있으나,  ImageMagick 으로 conver하는 것이 가장 이미지의 원본을 보호하고 콤팩트하게 리사이징되는 것을 확인했습니다.
아래는 사용 방법에 대한 절차를 기술합니다.

1. ImageMagick 소스 다운 로드 및 설치
 - 다운로드 :  http://www.imagemagick.org/script/install-source.php#unix
 - 설치 방법 : ./configure --prefix=/home/k2/server/ImageMagick-6.3.4 --enable-shared;make;make install

2. 이미지 convert 실행 함수 추가
 - 소스는 아래와 같습니다.
private String CONVERT_PROG = "convert";
public boolean convert(String source, String destination,
   int width, int height, int quality)
{
 List<String> command = null;
 try {
  if (quality < 0 || quality > 100)
   quality = 75;
  
  command = new ArrayList<String>(10);
  command.add(CONVERT_PROG);
  command.add("-geometry");
  command.add(width + "x" + height);
  command.add("-quality");
  command.add(Integer.toString(quality));
  command.add(source);
  command.add(destination);   log.info(command);
 } catch (Exception e) {
  log.error(e);
 }
 return exec((String[])command.toArray(new String[1]));
}
private boolean exec(String[] command)
{
 Process proc = null;
 int exitStatus = -1;  try {
  proc = Runtime.getRuntime().exec(command);
 } catch (Exception e) {
  log.error(e);
  return false;
 }  while (true) {
  try {
   exitStatus = proc.waitFor();
   break;
  } catch (java.lang.InterruptedException e) {
   log.debug("Interrupted: Ignoring and waiting");
  }
 }
 if (exitStatus != 0) {
  log.debug("Error executing command: " + exitStatus);
 }
 return (exitStatus == 0);
}

3. Spring에서 이미지 업로드 하기
 - commons-fileupload.jar, commons-io.jar를 활용한 업로드 이미지입니다. 아래는 xxx-servlet.xml에 추가될 내용입니다.

<bean id="multipartResolver"
   class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
   <property name="maxUploadSize" value="1000001"/>
</bean>
 // 해당 Controller에 다음 내용 추가
<property name="multipartResolver" ref="multipartResolver" />
<property name="destinationDir" value="/home/k2/www/test/files" />
 - Controller의 initBinder, onBindAndValidate, onSubmit()함수에 기능 추가
 - initBinder 기능 추가
protected void initBinder(HttpServletRequest request,
  ServletRequestDataBinder binder) throws Exception
{
 log.info("initBinder()");
 binder.registerCustomEditor(String.class, new StringMultipartFileEditor());
 super.initBinder(request, binder);
}
 - onBindAndValidate() 에 Validation기능 추가
protected void onBindAndValidate(HttpServletRequest request,
 Object command, BindException errors) throws Exception
{
 MultipartHttpServletRequest multipartRequest = null;
 MultipartFile  cfile = null;
 log.info("onBindAndValidate()");
 User user = (User) command;
 if (user != null) {
  String file = user.getFile();
  if (file != null) {
   multipartRequest = (MultipartHttpServletRequest) request;
   cfile = multipartRequest.getFile("file");
  }
  if (!errors.hasErrors()) {
   if (cfile != null) {
    if (cfile.getSize() > 1000000)
     errors.rejectValue("file", "error.profile.fileSize");
   }
  }
  if (!errors.hasErrors()) {
   if (cfile != null) {
    String ext = this.getExtensionFile(cfile).toLowerCase();
    if (!"jpg".equals(ext) && !"gif".equals(ext) && !"png".equals(ext))
     errors.rejectValue("file", "error.profile.fileGroup");
   }
  }
 }
 super.onBindAndValidate(request, command, errors);
}
 - onSubmit()에 기능 추가
protected ModelAndView onSubmit(HttpServletRequest request, 
   HttpServletResponse response,
 Object command, BindException errors) throws Exception
{
 log.info("onSubmit()");
 User user = (User) command;
 String srcPath = null;
 String destPath = null;
 if (user != null) {
  String file = user.getFile();
  if (file != null) {
   MultipartHttpServletRequest multipartRequest =
(MultipartHttpServletRequest) request;
   MultipartFile  cfile =  multipartRequest.getFile("file");
   File dirPath = new File(destinationDir);
   if (!dirPath.exists())
    dirPath.mkdirs();
   String sep = System.getProperty("file.separator");
   File uploadedFile = new File(destinationDir + sep + user.getUsername()
+ "_" + cfile.getOriginalFilename());
   FileCopyUtils.copy(cfile.getInputStream(), new FileOutputStream(uploadedFile));
   srcPath = destinationDir + sep + user.getUsername() + "_" +
cfile.getOriginalFilename();
   destPath = destinationDir + sep +
"thumb_" + user.getUsername() + "_" + cfile.getOriginalFilename();
   new CmdUtil().convert(srcPath, destPath, 78, 78, 95);
   //new CmdUtil().exec() 사용해서 rcp기능 추가
   user.setFile(destPath);
  }
  this.daoFacade.updateUser(user);
 }
 return super.onSubmit(request, response, command, errors);
}
 - Setter 추가
public void setMultipartResolver(MultipartResolver multipartResolver) 
{
 this.multipartResolver = multipartResolver;
}
 
public void setDestinationDir(String destinationDir)
{
      this.destinationDir = destinationDir;
}
이상으로 주요 중요한 기능들만 알면 쉽게 이미지 업로드해서 Thumnail 이미지까지 생성하는 방법을 기술했습니다. 도움이 되었으면 하네요. ^^

gdb 사용 방법

C/C++ 프로그래밍을 하시는 분들은 gdb를 많이 사용하실겁니다. 물론 완벽하게 코딩하시면 뭐 필요 없을 테니깐요.. 간단하게나마 제가 알고 있는 것들을 공유해 드립니다. 그리 많은 정보는 아니고 이것만 알아서 쉽게 문제점들을 찾을 수 있어서 공유합니다.

1. gdb로 디버깅 방법

먼저 gdb <실행화일> -c <core 화일> 하여 디버거를 실행시킨후 아래와 같이 bt(backtrace)명령어로 어떤 함수를 부르다 죽었는지 확인합니다.
(gdb) bt // or where
#0 0xc00000000010e500:0 in pthread_mutex_lock+0x720 ()
from /usr/lib/hpux64/libpthread.so.1
#1 0xc000000000450b90:0 in __thread_mutex_lock+0xb0 ()
from /usr/lib/hpux64/libc.so.1
#2 0xc000000000424960:0 in fprintf+0x240 () from /usr/lib/hpux64/libc.so.1
#3 0x4000000000004380:0 in main (argc=2, argv=0x9ffffffffffff290)
at corpIF.C:326
(gdb)
corpIF.C의 326라인에서 보니까 main->fprintf 에서 코어가 발생했습니다.
이제 frame 명령어로 해당 스택으로 이동합니다. 이후 list 명령어로 소스 파일을 확인해 보면 정확한 원인을 유추할 수 있습니다.
(gdb) frame 2
#2 0xc000000000424960:0 in fprintf+0x240 () from /usr/lib/hpux64/libc.so.1
(gdb) list
4#2 0xc000000000424960:0 in fprintf+0x240 () from /usr/lib/hpux64/libc.so.1
(gdb) list
239 void stat_process();
240
241 ////////////////////////////////////////////////////////////////////////
242 // main
243 ////////////////////////////////////////////////////////////////////////
244 int main(int argc, char *argv[])
245 {
246 /* EXEC SQL BEGIN DECLARE SECTION; */
247
248 char *uid = (char *)"mimul/mimul@mimuldb";
(gdb)
해당 계정이 맞는 지 확인해 보시면 코어의 원인을 확인할 수 있습니다.
(gdb) print sqlca.sqlcode
$3 = -1017
(gdb)
[mimuldb]/user> oerr ora 1017
01017, 00000, "invalid username/password; logon denied"
// *Cause:
// *Action:
즉, 해당 소스 파일의 오라클 계정의 아이디와 패스워드가 불일치하여 생긴 코어임을 최종 확인할 수 있습니다.

2. 그외 참고 사항
여기는 gdb에 관련된 간단한 커맨드 사용 방법을 알려드립니다.
[mimuldb]/user>gdb a.out
(gdb) r 20080707 // arg1- 실행
Starting program: /user/corpIF 20080707
warning: Load module /oracle/ORA9/lib/libclntsh.so.10.1 has been stripped.
Debugging information is not available.

warning: Load module /oracle/ORA9/lib/libnnz10.so has been stripped.
Debugging information is not available.

오라클 데이타베이스 연결에 실패하였습니다.
[mimul/mimul@mimuldb, ORA-01017: invalid username/password; logon denied]

Program received signal SIGSEGV, Segmentation fault
si_code: 2 - SEGV_ACCERR - Invalid Permissions for object.
0x9fffffffbf65e500:0 in pthread_mutex_lock+0x720 ()
from /usr/lib/hpux64/libpthread.so.1
(gdb) l 50 // 50근처의 소스 전후 10라인 표시
45 /* Binding to PL/SQL Records */
46 struct sqltdss
47 {
48 unsigned int tdsvsn;
49 unsigned short tdsnum;
50 unsigned char *tdsval[1];
51 };
52 typedef struct sqltdss sqltdss;
53 static struct sqltdss sqltds =
54 {
(gdb) l stat_process // stat_process함수 위치의 10라인 표시
512
513 ////////////////////////////////////////////////////////////////////////
514 //
515 ////////////////////////////////////////////////////////////////////////
516 void stat_process()
517 {
518 /* EXEC SQL BEGIN DECLARE SECTION; */
519
520 int v_Result;
521 /* varchar v_Status[32+1]; */
(gdb) next //다음라인까지 프로그램 실행
(gdb) step // 다음 instruction 실행
(gdb) finish // 현재 프로그램 실행 중지
(gdb) up // 이전 프레임
(gdb) down // 다음 프레임
(gdb) call myfunction() // 사용자 정의 함수 호출
(gdb) display x // x라는 변수의 값 출력
PS : //이하 문자열은 제가 주석으로 인식하고 해당 커맨드를 설명하는 문구를 넣음
태그 :

Microsoft Surface at the Rio in Las Vegas

Touch 기술의 미래를 보는 것 같습니다. MS Surface의 미래 기술들을 보여주고 있습니다.
한번 들어보세여.

잠시만 기다려주세요. ^^

 

태그 :

[사이트 소개] Talk War

대한민국은 지금 토론중입니다. <100분토론>이나 <생방송 심야토론>, <시시비비> 등 각 방송사의 TV토론 프로그램들은 심야 시간대라는 편성의 불리함에도 불구하고 높은 시청률을 보이고 있고, 온라인에서는 아고라, 티워(Talk War), idoo(debate.idoo.net)에서 많은 네티즌의 참여하는 것을 보면 이를 증명해 줍니다.

그러면 방송매체의 토론 문화와 온라인에서의 토론 문화는 어떤 차이점들이 있을까요?
방송 매체를 필두로 하여 오프라인에서는 사람들이 논리적인 설득과 경청이 어느 정도 이루어지고 있다면, 온라인에서는 다분히 객관적인 논리보다는 자기가 원하는 논리와 경청보다는 일방적인 자기 의견의 표현방식이 다소 있으며 심지어 일부는 객관성이 담보되지 않는 인신공격, 악플과 같이 일방적인 소비의 모습과 통제되지 않는 모습을 종종 보여주고 있습니다.

이런 문제점, 약점들을 보완하기 위해서 온라인에서 많은 시도가 되고 있는듯 합니다.
그 중에 하나가 대학생 연합 벤처 동아리인 DEMO 출신들로 이루어진 게임 기반의 온라인 토론 서비스인 티워입니다.

소모적이고, 상대를 비방하는 논쟁을 최소화할 수 있도록 자체 필터링 기능도 제공하고 있고, 10, 20대들이 자발적인 참여가 이루어져 사회의 다양한 측의 의견들을 볼 수 있게 해줄 뿐만 아니라, 다양한 의견들을 개진할 수 있도록 채널도 다양화하고 그때 그때 사회적인 이슈 토크 채놀로 만드는 등 능동적인 모습을 보여주는 것이 특징입니다.

뭔가 역동적이라는 느낌을 받습니다. 저만 그런가요?
한번 가서 젊은이들의 의견들을 한번 보세요. 세상은 넓고, 생각은 깊고, 의견들은 다양하다는 걸 느끼실겁니다. 자신의 생각과 견주어 보세요.

아래는 토크가 끝난 채널들은 재밌게 함축적으로 표시해 줍니다.

대한민국 네티즌이시여 ! 꽉 막힌 세상에 등불이 되어 주시고 소통의 장을 만들어 주세요.

태그 :

mysql 커맨드 모음

MYSQL 커맨드 관련된 모든것들을 정리해 봤습니다. 가끔 자주쓰지 않는 커맨드들은 까먹기가 쉬워서 적어보았습니다.

1) mysql  로그인.
—->[mysql dir]/bin/mysql -h hostname -u root -p

***************************************************************
2) 데이터 베이스 생성하기
—-> create database [databasename];
—->eg :- create database college;

****************************************************************
3) 모든 데이터 베이스 정보 보기.
—-> show databases;

*****************************************************************
4) 해당 데이터 베이스로 이동하기
—–> use [databasename];

*****************************************************************
5) 테이블 정보 보기
——->show tables

******************************************************************
6) 데이터 베아스에 있는 테이블들의 필드 정보 보기
—–> desc [table name];

*******************************************************************
7) 데이터 베이스 삭제
—> drop database [database name];
eg:- drop database college;

******************************************************************
8) 테이블 생성.
—–>CREATE table tablename(field_one datatype(size),fiels_two datatype(size));

eg1:-mysql> CREATE TABLE student( id INT(20),name VARCHAR(100));
Query OK, 0 rows affected (0.03 sec)

eg:-2 mysql> CREATE TABLE [table name] (firstname VARCHAR(20), middleinitial VARCHAR(3), lastname VARCHAR(35),suffix VARCHAR(3),officeid VARCHAR(10),userid VARCHAR(15),username VARCHAR(8),email VARCHAR(35),phone VARCHAR(25), groups
VARCHAR(15),datestamp DATE,timestamp time,pgpemail VARCHAR(255));
*******************************************************************
9) 테이블에서 auto_increment 생성

—> CREATE TABLE tablename(field_one datatype(size) NOT NULL AUTO_INCREMENT PRIMARY KEY , field_two datatype(size));

eg:-mysql> CREATE TABLE student (id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) );
Query OK, 0 rows affected (0.01 sec)

*******************************************************************
10) 테이블 생성 시 timestamp 적용
—> CREATE TABLE student ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
data VARCHAR(100), cur_timestamp TIMESTAMP(7) );

*******************************************************************
11테이블 생성 시 TIMESTAMP DEFAULT NOW() 적용

—> CREATE TABLE student (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100), created TIMESTAMP DEFAULT NOW());

*******************************************************************
12) 테이블 명세 보기
—-> DESC tablename;

*********************************************************************
13) 테이블 삭제
—–> drop table [table name];
eg) drop table student;

*********************************************************************
14) 테이블에 INSERT
—–>INSERT INTO [tablename] (filed_one,field_two,feild_three) values(value1,value2,value3);

eg:-INSERT INTO student (id,name,branch) values(1,’Amit’,'computer science’);

*******************************************************************
15) 패스워드 변경(unix shell에서)
—->mysql dir]/bin/mysqladmin -u root -h hostname.blah.org -p password ‘new-password’

******************************************************************
16) 패스워드 변경(MySQL 내에서)
—-> SET PASSWORD FOR ‘user’@'hostname’ = PASSWORD(’passwordhere’);

******************************************************************
17) GRANT privileges
—–>grant all privileges on [databasename].* to user@’localhost’ identified by ‘passwd’;

******************************************************************
18) GRANT specific privileges
—-> GRANT SELECT ON databasename.* TO username@’localhost’ IDENTIFIED BY ‘password’;

To enable more options you would separate them with a comma. So to enable SELECT, INSERT, and DELETE your syntax would look like this;

—–>GRANT SELECT, INSERT, DELETE ON database.* TO username@’localhost’ IDENTIFIED BY ‘password’;

Once you have given the desired privileges for your user, you will need to run this command within the MySQL command prompt;

—–>FLUSH PRIVILEGES;

To see a list of the privileges that have been granted to a specific user;

—–> select * from MySQL.user where User=’user’ \G

This is a list of privileges that you can grant;

Privilege Meaning
ALL [PRIVILEGES] Sets all simple privileges except GRANT OPTION
ALTER Enables use of ALTER TABLE
CREATE Enables use of CREATE TABLE
CREATE TEMPORARY TABLES Enables use of CREATE TEMPORARY TABLE
DELETE Enables use of DELETE
DROP Enables use of DROP TABLE
EXECUTE Not implemented
FILE Enables use of SELECT … INTO OUTFILE and LOAD DATA INFILE
INDEX Enables use of CREATE INDEX and DROP INDEX
INSERT Enables use of INSERT
LOCK TABLES Enables use of LOCK TABLES on tables for which you have the SELECT privilege
PROCESS Enables the user to see all processes with SHOW PROCESSLIST
REFERENCES Not implemented
RELOAD Enables use of FLUSH
REPLICATION CLIENT Enables the user to ask where slave or master servers are
REPLICATION SLAVE Needed for replication slaves (to read binary log events from the master)
SELECT Enables use of SELECT
SHOW DATABASES SHOW DATABASES shows all databases
SHUTDOWN Enables use of MySQLadmin shutdown
SUPER Enables use of CHANGE MASTER, KILL, PURGE MASTER LOGS, and SET GLOBAL statements, the MySQLadmin debug command; allows you to connect (once) even if max_connections is reached
UPDATE Enables use of UPDATE
USAGE Synonym for “no privileges”
GRANT OPTION Enables privileges to be granted

********************************************************************
19) 테이블 갱신.
—-> Update table tablename SET fieldname=newvalue where fieldname=oldvalue;
eg1:- Update table student set id=2 where id=2;
eg2:- Update table student set name=’Arun’ where name=’Amit’;

********************************************************************
20) 테이블 필드 정보 수정
—-> update table table name MODIFY fieldname(new size);
eg:- Update table tablename MODIFY id(30);

********************************************************************
21) 테이블에 한 레코드 삭제.
—> DELETE from [table name] where [field name] = ‘value’;

********************************************************************
22) 테이블의 필드(칼럼) 삭제
—->alter table [table name] drop column [column name];

*******************************************************************
23) 테이블에 새로운 칼럼 추가
—–> alter table [table name] add column [new column name] varchar (20);

***************************************************************
24) 테이블의 칼럼 이름 변경
—-> alter table [table name] change [old column name] [new column name] varchar (50);

*****************************************************************
25) 테이블의 unique 칼럼 추가
—-> alter table [table name] add unique ([column name]);

******************************************************************
26) 테이블의 칼럼 정보 변경
—-> alter table [table name] modify [column name] VARCHAR(3);

*****************************************************************
27) 테이블 조회

To see alla values of a table use

SELECT * from tablename;

To select specific values from a table use

SELECT fieldname_one,fieldname_two from tablename;

To select fields based on condition

SELECT fieldname_one,fieldname_two from tablename where [condition];

eg:-SELECT id from student where name=’Arun’;

28 ) 테이블 Dump

[mysql dir]/bin/mysqldump -c -u username -ppassword databasename tablename > /tmp/databasename.tablename.sql

29)  Dump 테이블 Restore
[mysql dir]/bin/mysql -u username -ppassword databasename < /tmp/databasename.sql

태그 :