<< 7월 2008 | | 9월 2008 >>

Open Social 아키텍처

Open Social(Open Mesh?)에 대한 아키텍처 정보가 있어 공유합니다. 구글, 야후, MS, Facebook&Myspace에 대한 Open Social에 대한 아키텍처 정보입니다. Facebook&Myspace는 과연 Closed Meshup 정책인가요?

1. Google

google

2. Yahoo



3. MS



4. Facebook & Myspace



[참고 사이트]
  • http://blog.broadbandmechanics.com/2008/08/4-appendices-that-conclude-how-to-build-the-open-mesh

플래닛 테러(Planet Terror, 2007)

planet terror감독 : 로버트 로드리게즈
배우 : 로즈 맥고완, 프레디 로드리게즈, 브루스 윌리스, 네이빈 앤드류스, 마이클 빈

바이러스 DC-2가 퍼지며 텍사스의 어느 작은 마을은 좀비들의 천국으로 변모한다. 미국 정부의 배신으로 바이러스에 감염된 멀둔 중위(브루스 윌리스) 일당이 바이러스 항체의 소유자를 찾아내기 위해 무차별적으로 바이러스를 살포한 것이다. 마을 의사를 꿈꾸다 고고 댄서가 되었고, 이제는 코미디언이 되려 하는 체리 달링(로즈 맥고완)과 그녀를 한없이 사랑하는 미스터리한 과거의 소유자로 엘 레이(프레디 로드리게즈, 그 이름으로 보자면 <엘 마리아치>와 <데스파라도> 주인공의 또 다른 분신처럼 보인다) 등 몇몇 생존자들은 좀비들과 피비린내 나는 사투를 벌여야 한다. 로드리게즈는 조지 로메로의 <살아 있는 시체들의 밤>의 황당무계한 설정을 본떠 ‘인간 도축장’이라 불러도 좋을 살육의 향연을 선사하면서도, “세상에 맞선 두 사람”(Two Against The World)을 외치는 체리 달링과 엘 레이의 ‘트루 로맨스’(얼핏 이 영화는 <트루 로맨스>의 좀비 버전 같기도 하다)와 자신을 허접 재능의 소유자로 폄하하며 소심과 자학의 극치를 보여주던 체리 달링이 여전사로 변모하는 성장의 드라마까지 곁들인다. 좀비에게 잘려나간 한쪽 다리 대신 ‘머신건’을 꽂고 ‘기계-되기’에 성공한 체리 달링이 좀비 일당을 일거에 쳐부술 때, 그녀는 세상을 구원하는 의사이자, 관객을 웃겨주는 완전한 코미디언으로 거듭나는 것이다.

엘 레이와 체리 달링 외에도 톡톡 튀는 다채로운 캐릭터를 지켜보는 재미 역시 솔솔하지만, <플래닛 테러>의 가장 큰 매력은 그라인드 하우스 특유의 영화 체험을 되살려내는 방식이다. 갑작스럽게 영화의 색감이 바뀐다거나, 필름에 난 스크래치가 화면에 연방 굵은 빗줄기를 내리게 하는 것 정도야 동시상영관에서 살다시피한 소년 시절에 대한 향수어린 정감을 느끼게 해줘 고맙기 그지없지만, 시선집중 100%를 자랑하는 에로틱 장면의 절정에서 필름 릴이 불에 타 손상되었다며 능청스럽게 다음 장면으로 전환하는 ‘몹쓸 짓’을 자행할 때는 치떨리는 분노가 느껴진다(더구나 그녀는 다름 아닌 로즈 맥고완이 아닌가!). 하지만 새빨간 립스틱의 입술과 끈적끈적한 노골적 몸짓을 빅클로즈업으로 감칠맛나게 잡아주는 센스와 인간의 내장 기관을 상세히 보여주는 해부학적 서비스 정신은 세상의 금기를 비웃는 B급 좀비영화 특유의 카니발적 쾌락을 선사하기에 충분하다. 악의 축 어쩌고저쩌고하며 세계 평화의 구세군인 척 행세하는 미국사회에 대한 조롱은 또 다른 양념이다. 참고로, 올 여름 다이어트가 필요하다면 무엇보다 이 영화를 보라. 웃기고, 통쾌하고, 확실히 밥맛 떨어진다.

킬빌의 감독이 잠깐 나왔습니다. 쿠엔틴 타란티노 ^^

 

태그 :

jdk 1.4이하에서 java.net.URL Timeouts 지정하기

타임아웃 지정하는 방법은 두가지입니다. sun.net.client.defaultConnectTimeout값을 지정하는 경우sun.net.client.defaultReadTimeout항목에 대한 system properties를 사용하는 것입니다.

1. sun.net.client.defaultConnectTimeout값 지정

-Dsun.net.client.defaultConnectTimeout=10000
-Dsun.net.client.defaultReadTimeout=10000
2. system properties 설정

System.setProperty("sun.net.client.defaultConnectTimeout", 100000);
System.setProperty("sun.net.client.defaultReadTimeout", 100000);

3. 타임 아웃 단위

 
- miliseconds

jdk 1.5이상의 경우에는 setReadTimeout(int timeout), setConnectTimeout(int timeout)이 정의되어 있어 설정하면 됩니다. 참조 사이트는 http://java.sun.com/j2se/1.5.0/docs/api/java/net/URLConnection.html#setReadTimeout(int) 입니다.
태그 :

jdk1.5에서 concurrent library를 사용해서 contention 피하기

Java Concurrency in Practice책에 의하면 jdk1.5의 java.util.concurrent 패키지를 활용하면 동기화에 대한 contention의 부하를 줄일 수 있는 방법들을 제시합니다.

1. ThreadLocal 사용
아래의 예제처럼 ThreadLocal을 통해 synchronization을 대체할 수 있습니다.

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateUtil
{
private ThreadLocal<DateFormat> sdf = new ThreadLocal<DateFormat>() {
protected DateFormat initialValue()
{
return new SimpleDateFormat("yyyyMMdd'T'HH:mm:ss");
}
};

public String getCurrentDate()
{
return sdf.get().format(new Date());
}


public static void main(String[] args)
{
DateUtil du = new DateUtil();
System.out.println(du.getCurrentDate());
}
}

initialValue를 오버라이드를 통해 최초에 생성자가 호출 될 경우 해당 변수가 초기화되어 사용이 가능해집니다.

2. ConcurrentMap 사용
java.util.concurrent.ConcurrentHashMap를 사용하여 하나 이상의 쓰레드가 contention하는 것을 보호할 수 있도록 해 줍니다.

import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ConcurrentHashMap;

public class MapUtil
{
private ConcurrentMap<String, String> userMap;
private final int CAPACITY = 100;

private MapUtil()
{
if (userMap == null)
userMap = new ConcurrentHashMap<String, String>(CAPACITY);
}

private void changeUser(String userId, String name)
{
// 동기화 안해도 됨
String lastValue = curMap.put(userId, name);
}

private String findUser(String userId)
{
// 동기화 안해도 됨
return curMap.get(userId);
}
}

3. CopyOnWriteArrayList 사용
Listener (AKA observer) pattern에 사용할 경우 많이 사용됩니다.
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

public class ListenerUtil
{
private List<ActionListener> listeners;

public ListenerUtil()
{
listeners = new CopyOnWriteArrayList<ActionListener>();
}

public void addActionListener(ActionListener listener)
{
// 동기화 되지 않음
listeners.add(listener);
}

public void removeActionListener(ActionListener listener)
{
// 동기화 되지 않음
listeners.remove(listener);
}

public void fireActionEvent()
{
for (ActionListener listener : listeners)
{
listener.actionPerformed(new ActionEvent(this, 1, "HELLO"));
}
}
}
태그 :

jpg, png, tiff 파일 ImageMagic 툴에서 사용 방법

gif, bmp파일은 thumbnail에서 자동 변환이 가능한데 jpg, png, tiff파일을 컨버팅처리할 경우 아래와 같은 오류(convert: no decode delegate for this image format)를 맞이할 경우 막막하죠? ^^
하지만, 아래의 방법을 적용하여 순차적으로 처리해 주면 정상적인 컨버팅이 됩니다.

1. 다운로드
  • JPEG library: http://www.ijg.org/files/jpegsrc.v6b.tar.gz
  • PNG library: http://www.libpng.org/pub/png/libpng.html
  • ImageMagic library : ftp://ftp.carnet.hr/misc/imagemagick/ImageMagick-6.4.3-4.tar.gz
  • libtiff-lzw-compression-kit library : http://dl.maptools.org/dl/libtiff/old/libtiff-lzw-compression-kit-1.5.tar.gz
  • tiff library : http://dl.maptools.org/dl/libtiff/old/tiff-v3.6.1.tar.gz

2. jpeg library 설치

tar zxvf jpegsrc.v6b.tar.gz
cd jpeg-6b
cp /usr/share/libtool/config.sub .
cp /usr/share/libtool/config.guess .
mkdir -p /usr/local/man/man1
./configure
make
make install
ranlib /usr/local/lib/libjpeg.a
cd ../
3. PNG library 설치

tar xfz libpng-1.2.18.tar.gz
cd libpng-1.2.18
./configure
make
make install
cd ..
4. tiff library 설치

tar xvfz libtiff-lzw-compression-kit-1.5.tar.gz
tar xvfz tiff-v3.6.1.tar.gz
cd tiff-v3.6.1/libtiff
cp ../../libtiff-lzw-compression-kit-1.5/tif_lzw.c
make
make install
cd ..
5. ImageMagick 반영

tar xfz ImageMagick-6.4.3-4.tar.gz
cd ImageMagick-6.4.3
./configure --enable-shared --enable-lzw --with-jpeg=yes
--with-png=yes --with-tiff=yes --disable-static --without-perl
make
make install
cd ..
6. 커맨드 사용 예
 - convert -strip -scale 3%x3% -quality 70 test.jpg thumbnail_test.jpg

[관련 포스트]

ArsClip - 괜찮은 클립 보드 프로그램

1. 설치용 방법
 - 다운로드 받은 파일의 압축만 해제해 놓는 것으로 즉시 사용이 가능함.

2. 특징
- Multiple permanent items groups : 핫키에 클립데이터를 미리 지정할 수 있음.
- Picture, RichText, File Copy, Unicode, HTML support
- Keypress emulation
- Form Mode for pasting multiple fields
- Highly configurable

3. 설정
 - 아래 그림같이 오른쪽 트래이 아이콘을 오른쪽 마우스 클릭한 다음 Permanent Items..를 클릭해서 추가로 단축카와 저장된 문자열을 붙여넣기가 가능하다.



4. 사용
 - CTRL+SHIFT+Z를 사용하여 기존에 카피된 것들을 CTRL+V를 통해 자동으로 붙여넣기가 됩니다.
태그 :

LoadRunner 사용방법

1. 스크립트 작성

 - Mecury LoadRunner>Applications>Virtual User Generator>Web 선택
 - Edit Recording Options 선택
 - Recording 선택
   . Recording Level 을 HTML-based script로 선택한 후 HTML_Advanced를 클릭한다.
   . Script Type(a script containing......) 과 Non HTML-generated elements(do not Record)
   .  Ok
 - Start Record 선택
   . URL등록 : http://ktopenid.com
   . Action 선택 > OK
   . 자동으로 레코딩을 시작함
 - Insert Start Transaction(Ctrl + T)
   . Transaction Name : 로그인
   . 로그인 버튼 클릭 : 오픈 아이디 넣고 패스워드 넣고 로그인 버튼 클릭하면 자동 스크립트 추가됨
 - End Transaction 클릭
   . LR_AUTO 산택 > OK
 - Action 부분의 web_url()부분을 잘라서 vuser_init에 붙여넣음
 - 저장버튼을 클릭하여 스크립트를 저장함
 - 스크립트 검증
   . Runtime Settings클릭
   . Log클릭
   . Log 셋팅
 - Run을 실행하여 결과가 정상인 지 확인
   . View > Test Results에서 확인

2. 시나리오 작성

 - Mecury LoadRunner>Applications>Controller 실행
 - 스크립트 선택> 브라우저 클릭>Open Test에서 해당 스크립트 선택>열기
 - OK
 - Edit Schedule
   . Ramp Up, Duration, Ramp Down 설정
 - Load Generator(로드 테스트 장비 선택)

3. 실행

 - Run Tab에서 Start Scenario를 클릭하여 실행
 - 완료 후 Report 자동 생성됨
태그 :

‘생각이 있는’ 기업

선진 기업과 대등한 경쟁을 해야 하는 이상 이제 우리 기업에게도 ‘생각’이 필요해졌다. ‘물건만 열심히 만들면 된다’는 소박한 믿음으로도 성장이 가능했던 시절은 지나갔다. 한국 기업들도 창의적인 전략으로 남들이 가지 않는 길을 개척해 나아가야 한다.

한국에 귀화해서 살고 있는 변호사이자 방송인인 로버트 할리 씨가 한국말 중에 이해되지 않는 표현이 있었다고 한다. 바로 헤어질 때 하는 인사말 ‘수고하세요’이다. ‘수고하라’는 표현은 영어로 따져보면 ‘Work hard’인데, 미국 사람들은 헤어지면서 이러한 말을 하지 않는단다. 그래서 한국 사람들한테 ‘수고해’라는 말을 들을 때마다 찜찜했다고 한다. 미국에서는 이 경우에 ‘Take it easy’라는 인사말을 자주 사용하는데, 이 말은 ‘천천히 하라’는 뜻으로 ‘수고하세요’와 정반대의 의미를 가지고 있다. 할리 씨는 그래서 한국생활 초창기에 ‘수고하지 마십시오’라고 했더니, 어떤 사람은 기분 나빠하며 ‘안녕히 가지 마십시오’라고 되받아 치더라고 한다. 그 후 그 역시 ‘수고하라’는 말을 쓰지만 아직도 왜 이렇게 표현하는지 알 수 없다고 한다. ‘정말로 한국인들은 열심히 일하는 것을 좋아하는가 보다’라고 생각할 수 밖에……

‘수고하라’는 말과 함께 한국인들이 자주 쓰는 말이 ‘열심히 하라’는 말이다. 언어는 시대를 반영한다. 먹고 살기 힘들었던 시절, ‘밥 먹었어?’라는 인사말을 자주 썼던 것이 그 예다. ‘수고하라’, ‘열심히 하라’는 표현에도 한국의 발전 과정이 녹아있을 것이 틀림없다.

한국인들은 선진국이 했던 것을 뒤따라 하면서 발전해 왔다. 그 노력이 오늘의 한국을 만들었다. 한국 기업들 역시 선진 기업들이 하던 것을 그대로 들여와서 그들과 같은 수준으로 이루어 내기 위해 일단 열심히 일하고 보았다. 당시로서는 한국 기업들에게 고민 많이 하지 말고 열심히 하는 것은 당연한 것이었고 정답이었다. 생산성이 뒤지는 것을 더 많은 시간 일해 보충했고, 품질이 떨어지면 전수검사를 해서 맞추는 식으로 일했다. 한국인들에게 ‘수고해’라는 말은 아주 자연스런 것이었다.

허나 지금은 상황이 달라졌다. 이제 한국도 선진국 문턱에 와 있고, 한국 기업 역시 세계 최고의 글로벌 우량기업으로 발돋움하고 있다. 선진국을 모방하고, 선진 기업을 벤치마킹 하는 것으로 충분했던 시대가 지나간 것이다. 한국 기업들도 글로벌 기업들과 선진시장에서 같은 조건 하에서 경쟁해야 한다. 해외 시장의 고객들이 한국 기업의 제품이라고 해서 봐주지 않는다. 이제 일등이 하는 것을 그대로 따라 해서는 일등이 될 수 없다. 우리가 모방하는 동안 그들은 저만큼 앞서 나아가고 있기 때문이다.

그래서 이제 열심히 하는 것으로는 부족하다. 잘 해야 한다. ‘열심히 한다’는 것은 ‘아무 생각 없이 부지런히 일한다’는 것이다. 이것이 통하던 시대가 있었다. 하지만 이제는 기업도 생각을 해야 한다. 아무 생각 없이 열심히만 해서는 글로벌 경쟁에서 승자가 될 수 없다. 똑똑한 기업만이 살아남는 시대가 된 것이다.

네 종류의 사람

기업을 이야기하기에 앞서 한번 개인을 생각해 보자. 흔히 부지런하냐, 똑똑하냐에 따라 네 가지 유형을 생각해 볼 수 있다. 똑똑하고 부지런한 사람 ‘똑부’, 똑똑하고 게으른 사람 ‘똑게’, 멍청하고 부지런한 사람 ‘멍부’, 멍청하고 게으른 사람 ‘멍게’ 등이 그것이다. 얼핏 생각하기에는 똑부가 가장 바람직한 유형인 것 같지만 어떠한 일을 하느냐, 어떤 상황에 놓여 있느냐에 따라 적합한 유형이 달라진다. 가령 예술처럼 창의적인 일에는 똑게가 어울리지만, 단순 작업은 생각 많은 것이 오히려 방해가 되며 멍부가 가장 잘 할 수 있다.

네 유형 중에 누가 가장 바람직한 리더냐에 대한 논의는 오래 전부터 있어왔다. 단순한 생각으로는 똑똑하고 부지런한 지도자가 가장 바람직할 것 같은데, 실제는 그렇지 않다. 똑부는 너무나 유능한 나머지 조직원들이 그에게 기대게 되어 조직 전체가 게으르게 되기 때문이다. 그러니 똑부 밑에서는 아랫사람들이 일을 게을리 해 실력이 늘지 않을 가능성이 많다. 그래서 똑똑하고 게으른 리더가 가장 바람직하다고 보는 사람들이 많다. 민경조 코오롱건설 부회장은 CEO에도 앞서 말한 네 가지 유형이 있다고 하면서, 똑똑하고 게으른 사람이 최고라고 이야기했다. 똑게 CEO는 직접 뛰어다니는 일이 적고 유능한 직원에게 책임을 맡겨 일을 효과적으로 하기 때문이라는 것이다.

그러면 최악의 리더 유형은 무엇일까? 멍청하고 게으른 경우가 최악일 것 같지만, 오히려 멍청하고 부지런한 경우가 최악의 리더라고들 한다. 멍게는 생각도 없지만 게으르기 때문에 큰 사고를 치지 않는다. 복지부동형으로 조직에 전혀 도움이 되지 않지만 똑똑한 사람들이 정한 방향을 따라 가기 때문에 조직에 해가 되지도 않는다. 하지만 멍청하고 부지런한 지도자는 잘못된 결정을 내린 뒤 바로 실행에 옮기기 때문에 바로잡을 기회조차 주지 않는다. 방향감각이 없는 상태에서 열심히 하기 때문에 커다란 사고를 치게 되는 것이다. 더 큰 문제는 멍부는 대부분 ‘나는 멍청하지 않다’고 생각하는 데 있다. 열심히 하고 있기 때문에 자신이 무언가 일을 잘하고 있다고 착각하는 것이다.

한편 네가지 유형의 사람 중에 누가 가장 좋은 부하인가를 생각해 보면 사정이 달라진다. 부하들 중에서는 말을 잘 알아 듣고 열심히 하는 똑부가 제일 좋다. 멍부도 부하로 나쁘지 않은데, 방향을 정해주면 열심히 실행하기 때문이다. 요컨대 어느 유형이 가장 바람직하다고 말할 수 없다. 역할에 따라 적합한 사람이 달라질 수 있기 때문이다.

창의력과 실행력

그러면 기업에게 똑똑하고 부지런하다는 것은 어떤 의미인가? 똑똑한 기업, 즉 생각이 있는 기업이라 함은 경쟁사와 다른 창의적인 전략으로 기업이 나아갈 방향을 미리 그려놓고 실행하는 기업이다. 이들은 새로운 시장을 창조하며 고객에게 차별화된 가치를 제공하고 산업을 선도한다. 많은 기업들이 이러한 기업의 전략을 따라 한다. 하지만 그 때 이 기업은 다른 전략으로 한발 더 앞서간다.

기업에게 있어 ‘부지런하다’는 것은 ‘해야 할 일을 뒤로 미루지 않고 즉각 해낸다’는 의미다. 그래서 목표가 정해지면 무슨 일이 있어도 이를 달성해 내는 실행력이 부지런한 기업의 특징이다. 이러한 기업은 체질이 강하고 대부분의 일을 스스로 해내는 뚝심이 있다. 산업 환경이나 시장 여건이 좋지 않아도 목표를 달성한다. 주로 기존 고객을 공략하고 기왕에 존재하는 가치를 제공하는데 역점을 둔다.

기업에게 있어 똑똑함과 부지런함은 창의력과 실행력으로 귀결된다. 두 가지 기준으로 나누면 기업 역시 네 가지 유형이 있다고 볼 수 있다. 그런데 창의력도 없고 실행력도 부족한 기업은 경쟁에서 낙오되므로, 세 가지 유형을 이야기할 수 있겠다. 기업의 경우에도 어느 유형이 가장 좋다고 말할 수 없다. 기업이 처한 환경과 시대적 상황에 따라 적합한 전략이 다를 수 있기 때문이다. 우선 기업의 유형을 구체적으로 생각해 보자.

창의적인 전략을 선도하고 실행력도 뛰어난 기업으로는 GE를 생각해 볼 수 있다. GE는 설립 초기부터 산업 내에서 선두 기업이었다. 항상 남다른 생각으로 사업에 임했기 때문에 시장 환경을 그대로 받아들이지 않고 자신들에게 유리하게 바꾸기도 한다. 가령 전기산업 태동기에 시장이 작을 때는 고객들에게 다양한 금융 지원을 통해 시장을 창출하기도 했다. 이러한 전략을 발전시켜 현재 가장 많은 이익을 창출하는 금융서비스 사업을 일구었다.

그런가 하면 GE는 실행력을 강조하기도 한다. GE의 전 CEO였던 잭 웰치는 관료화된 GE를 혁신하기 위해서 워크아웃 운동이나 6시그마를 활용하여 GE의 실행력을 이끌어냈다. 잭 웰치가 리더십 있는 사람을 구별해 내는 방법으로 제시한 것이 4E다. Energy(활력), Energize(동기부여), Edge(결단력), Execution(실행력)이 그것인데, 이 중에서 가장 중요하게 생각했던 것이 실행력이다. 앞의 세 가지 E를 충족시키더라도 실제로 계획을 실행시켜 결과를 산출하지 못한다면 아무 소용이 없다는 이야기다.

실행력보다는 창의력이 뛰어난 기업으로는 애플을 들 수 있다. 2007년 애플은 회사 이름에서 ‘컴퓨터’란 단어를 뺐다. 맥(Mac), 아이팟(iPod), 애플TV, 아이폰(iPhone) 등 제품 카테고리 중 컴퓨터 관련 제품은 ‘맥’뿐이어서 회사명을 바꿨다고 한다. 사실 그 때까지 애플은 기술적으로 늘 앞서가는 컴퓨터 기업이었다. 이러한 애플이 자기정체성을 부정하며 새로움을 추구한 것이다. 애플은 아이팟과 아이튠스로 미국인들이 보다 편리하게 음악을 즐길 수 있도록 만들었다. 이후 아이폰을 출시하여 다양한 멀티미디어를 모바일 영역으로 확산시켰으며, 이제는 애플TV로 그 외연을 확장하고 있다. 컴퓨터 기업이 미디어 제품이나 통신, 가전 제품을 출시하면서도 승승장구할 수 있었던 것은 고객에게 차별화된 가치를 제공했기 때문이다. 이러한 차별화된 전략으로 애플은 비즈니스 위크에서 선정하는 ‘세계에서 가장 혁신적인 기업’에서 2005년 이후 줄곧 1위를 지켜오고 있다. 그런데 애플은 모든 것을 스스로 하지는 않는다. 핵심이 되는 소프트웨어의 설계를 제외하면 대부분의 제품을 대만의 폭스콘(Foxconn Electronics)에서 제조한다. 제조 경쟁력보다는 아이디어로 승부를 거는 기업이 애플이다.

마지막으로 창의력보다는 실행력이 뛰어난 기업으로는 앞서 이야기한 것처럼 한국 기업을 들 수 있다. 잡생각 없이 앞만 보고 뛰는 실행력이 지금의 한국 기업을 만들었다.

위에서 설명한 것처럼 최근 경영 환경은 실행력이 중심인 기업에게 전략적 창의성이나 차별화된 그림을 그릴 것을 요구하고 있다. 실행력이 중심이 되었던 과거의 전략이 더 이상 통하지 않게 된 것이다. 그런데 실행력이 핵심인 기업에게는 치명적인 약점이 있다. 멍부처럼 열심히 하고 있기 때문에 자신이 잘하고 있다고 생각한다는 점이다. 사실 이러한 기업 중에는 전략이 없는 기업이 많다. 하지만 그들은 자신들이 전략이 없다는 것을 모른다. 이들은 대부분 목표를 달성하는 것 자체를 전략이라고 생각한다. 그래서 이들의 ‘전략’이라는 것을 보면 매출과 이익을 얼마 달성하겠다는 식으로 숫자투성이다. 그럼에도 바쁘게 일하고 있기 때문에 자신들이 전략이 없다는 사실조차도 모른다.

행동하는 기업에서 생각하는 기업으로

유행이나 다른 사람의 생각을 그대로 이야기하는 것이 생각 없는 사람의 특징이다. 이는 곧 생각 없는 기업의 특징이기도 하다. 생각이 있는 기업은 항상 남다른 일을 하고 남과 다르게 일한다. 기존의 관행에 얽매이지 않고 항상 새로운 시도를 한다. 혁신이 일상화되어 있다. 특히 운영 효율성 혁신보다는 전략적 혁신에 많은 시간을 들인다. 그러면 생각이 있는 기업으로 도약하기 위해서는 어떻게 해야 할까?

● 새로운 일을 시도하라

우선 경영진이 자기 회사가 생각이 없는 기업이라는 점을 인식해야 한다. 목표 수치를 설정하고 달성하는 것이 전략이 아니라는 점을 깨달아야 한다. 또 생각하는 기업으로 바꾸겠다는 의지가 명확해야 한다. 해보지 않은 것이기 때문에 막상 도전하기가 힘들 것이다. 하지만 일단 새로운 것을 시도하는 것이 변화의 첫걸음이다.

흔히 기업에서는 성공 가능성이 적은 혁신적인 일을 시도하는 것을 꺼린다. 많은 자원을 투입해도 실패할 가능성이 크기 때문에 손해가 날 것을 두려워하기 때문이다. 개인적으로는 실패가 경력에도 좋지 않고 보상에서도 불리하게 작용하기 때문에 움직이지 않는다. 그래서 기업에서는 잘 아는 것만 시도하게 된다. 그러다가 사업 전체가 어려움에 빠진 후에야 어쩔 수 없이 색다른 시도를 하게 된다.

그러나 희망적인 진리가 있다. 가능성이 적은 일을 성공하기는 힘들지만 여러 번 시도하면 성공 확률이 높아진다는 것이다. 동전을 10번 던질 때 나오는 결과를 모두 맞출 수 있다고 장담하는 사람은 없다. 확률이 무려 1/1024로 0.1%도 안되기 때문이다. 하지만 1,000명이 시도한다면 어떻게 될까? 1,000명이 시도했을 때 동전 10번 던진 결과를 맞힌 사람이 나올 확률은 62%나 된다. 2,000명이 시도한다면 86%, 3,000명일 때는 95%나 된다. 5,000명이 시도했을 때는 99%가 넘는다. 성공 가능성이 0.1%도 안되는 일도 5,000명 이상인 회사에서 시도했을 때는 99% 이상 성공할 수 있다는 말이다. 결국 많은 시도를 하는 기업이 성공의 열매를 딸 수 있다. 아무리 작은 것이라도 일단 시작하는 것이 중요하다.

● 실행의 극한으로 창의력을 만들어 내라

새롭고 창의적인 일을 시도하라고 해서 실행력이 중요하지 않다는 얘기는 아니다. 제조업으로 역량을 쌓아온 한국 기업에게는 브랜드 자산이나 마케팅 파워 역시 제조 역량에서 나온다. 과거 일본 기업들이 원가가 싼 인도네시아 등으로 생산기지를 옮겼다가 다시 유턴하는 사례에서도 기본을 버리지 말아야 한다는 점을 깨달을 수 있다. 우리 기업이 하루 아침에 애플이 하는 방식으로 일을 하는 것은 어렵다. 또 나이키가 하듯이 마케팅만 하고 제조 등 나머지 기능을 아웃소싱하기도 어렵다. 최근 소프트 경쟁력이 강조되면서 나이키의 사업모델이 자주 거론된다. 사실 1962년 설립된 나이키는 초기부터 아웃소싱 전략을 택했다. 초기에는 일본의 신발 제조업체에서 신발을 만들다가 원가가 비싸지자 한국과 대만으로 공급처를 옮겼고 지금은 대만을 비롯한 인도네시아, 중국, 태국 등에서 아웃소싱을 하고 있다.

한국 기업의 창조적 전략은 우리의 장점인 실행력을 극대화했을 때 나온다는 점을 명심해야 한다. 우리가 과거에 쌓아온 것을 토대로 새로운 것을 만들어야 한다. 조선업에서 새로운 제품을 만든 대우조선해양의 LNG-RV선 사례를 살펴보자. LNG-RV선은 해상에서 뽑아낸 천연가스를 액화 및 기화 과정을 거쳐 소비자에게 직접 전달하는 선박이다. 즉 플랜트와 선박이 합쳐진 것인데, 대우조선해양의 플랜트 설비 제조 기술과 선박 건조 기술이 합쳐져 탄생했다. 2005년에는 천연가스를 해양에서 뽑은 후 바로 액화시켜서 운반하는 장치를 탑재했는데, 작년에는 기화시키는 장치까지 탑재하기 시작했다. 현재 이러한 선박을 건조할 수 있는 곳은 이 회사뿐이다. 차별화된 제품의 창의성이 실행력에 기반하고 있음을 알 수 있다.

이처럼 한국 기업은 우리가 잘 할 수 있는 제조역량을 차별화시킬 수 있는 방법을 찾아야 한다. 도요타가 창업 이래 지속적으로 제품을 끊임없이 개선해서 차별화된 제품을 만들어 내듯이, 우리의 역량을 토대로 새로운 전략을 고민해야 한다.

● 실패를 용인하는 문화를 조성하라

기업에서 새로운 시도를 하지 않는 것은 실패를 두려워하기 때문이다. 흔히 우리는 잘 했을 때 칭찬하고 실패했을 때 벌을 받는다는 신상필벌을 이야기한다. 결과를 중시하는 기업에서 이러한 현상이 나타난다. 하지만 새로운 것을 시도하기 위해서는 실패를 인정하고 용인할 필요가 있다.

우리에게 잘 알려진 3M의 포스트 잇 역시 실패에서 나온 것이다. 1968년 3M의 스펜서 실버라는 연구원은 참담한 실패를 맞보았다. 강력접착제 개발 프로젝트가 고무풀보다 약한 접착력을 가진 접착제로 막을 내렸기 때문이다. 하지만 실버는 이 부끄러운 결과를 동료들에게 털어놓았다. 몇 년 후 아트 프라이라는 연구원이 교회에서 성가집에 붙은 메모 테이프를 떼려고 애를 먹은 일이 있었다. 이 일로 쉽게 붙였다가 떼는 메모지를 개발하면 좋을 거라는 생각이 들었고 몇 년 전 실버로부터 들은 이야기가 생각났다. 그 결과 발명된 것이 포스트 잇이다. 만약 3M에서 실패를 용인하고 드러내는 분위기가 아니었다면 그 회사의 최대 발명품 중 하나인 포스트 잇은 세상의 빛을 보지 못했을 것이다.

우리 나라 사람들은 실패를 창피하게 여기면서 숨기는 경향이 있다. 최근 롯데 자이언츠에 새로운 희망을 불어넣고 있는 제리 로이스터 감독이 이런 이야기를 했다. “문화 차이인지 모르겠지만, 한국 선수들은 실패할 때마다 크게 실망한다. 미국 선수들은 실패를 두려워하지 않고 오히려 실패 경험을 바탕으로 성장한다.” 비슷한 이야기를 축구 명장인 히딩크 감독에게서도 들을 수 있다. “축구는 실패투성이 게임이다. 골을 만들어내려고 수많은 드리블과 패스끝에 겨우 한두 골로 승부가 결정되는 경기다. 그 숱한 시도들은 대부분 실패하고 만다. 축구는 실패를 컨트롤하는 경기다. 축구에서는 단 한 번의 실패보다 한 번의 성공을 위해 얼마나 많은 시도를 했느냐가 훨씬 중요하다.”

● 성공체험을 확산시켜라

실행에 익숙했던 조직에 창의성이 뿌리내리기 위해서는 또 하나가 필요하다. 바로 성공체험이다. 새로운 시도에 대한 성공체험은 기존의 관성을 바꾸는데 중요한 원동력으로 작용한다. 얼마 전 EBS TV에서 방영된 <아이의 사생활>이란 프로그램에서, 자아존중감을 가진 아이들은 공통적으로 성공체험을 했다는 점이 지적되었다. 성공체험이 자기확신과 자신감을 갖다주는 것이다. 기업 조직도 마찬가지다. 일단 쉬운 일이라도 성공을 거듭하게 되면 어려운 일에 부닥쳤을 때 인내심이 커진다. 그 결과 점점 더 어려운 일을 시도할 수 있게 되고 마침내 성공하게 되는 것이다.

2000년부터 8년 연속 세계 판매 1위를 하고 있는 LG전자의 에어컨 사업부가 성공할 수 있었던 것도 성공체험이었다. 에어컨 사업부의 한 직원의 말이다. “조직 내에서 한번 성공체험을 해본 사람과 그렇지 않은 사람은 천지 차이가 있다. 성공체험을 해본 사람은 중간 과정이 힘들어도 ‘된다’는 확신을 가지고 꾸준히 밀어붙인다. 반면 성공체험이 없는 사람은 중간 과정이 힘들면 자꾸만 다른 곳에 눈을 돌린다.” 다른 구성원이 부연한다. “성공체험을 해본 사람은 낙관적이고 긍정적이다. 그래서 꾸준히 노력하며 일에 대한 두려움과 망설임이 없다.” 즉 비즈니스라는 것이 답답하고 지루한 과정을 거치며 꾸준하게 진행되어야 성과가 나는데, 성공체험을 해본 사람과 조직만이 그 과정을 견딜 수 있다는 것이다. 작은 성공체험을 한 후 이것을 확산시키는 것이 그래서 중요하다.

스스로 생각하는 능력을 길러야

지금 한국 기업은 ‘부지런히 일하는 기업’에서 ‘생각이 있는 기업’으로 변해야 하는 시점에 있다는 것은 누구나 알고 있다. 많은 기업들이 차별화된 전략을 수립하기 위해서 동분서주하고 있다. GE를 찾아 다니고, 애플을 연구한다. 컨설팅 회사에서는 구미에 맞는 상품을 기획하여 판매하고 있다. 포트폴리오 조정, M&A, 신사업 등 중장기 전략 수립부터 창의적으로 생각하는 기술까지 패키지도 다양하다. 그러나 경쟁무기로서의 생각은 남이 해줄 수 없는 것이다. 다른 사람의 멋진 이야기를 자기 것인 양 떠벌려봤자 금방 들통난다. 내가 가진 철학과 무언가 어울리지 않기 때문에 말의 앞뒤가 맞지 않는다. 돈을 주고 논술 과외를 했다고 해서 큰 도움 안된다. 자신이 가지고 있는 생각이 아니므로 시험 볼 때만 당장 써먹고 금방 잊어버리게 된다. 논술 과외 받기보다 신문 보면서 스스로 생각한 학생들이 시험 더 잘 본다. 스스로 우리 체질에 맞는 전략을 개발해야 진정한 차별화가 가능하다. 생각은 하늘이 인간에게 준 가장 큰 선물이다.

[출처] LG경제연구원

Tomcat 보안

Tomcat 6.0.18 미만 버전에 존재하는 심각한 정보 유출 취약점이 드디어 공식적으로 문서화 되었습니다.

[참고 사이트]

  • Tomcat 6.x 의 취약점 정보 : http://tomcat.apache.org/security-6.html
  • 상세 정보 : http://www.milw0rm.com/exploits/6229

아파치 톰캣 6.0.18 이전 버전에 로컬 파일이 노출되는 심각한 취약점이 존재한다고 합니다.
/etc/passwd 같은 중요한 시스템 파일이 노출될 수 있어서 빠른 시간 내에 6.0.18로 업그레이드 하시길 권고합니다.
톰캣 5.5.x 대 버전이나 4.1.x 대 버전을 사용하시는 경우 아래의 설정 변경하는 것으로 대응하라고 하네요

  • context.xml이나 server.xml 설정 파일에서 allowLinking을 비활성화 하거나
  • URIencoding을 utf8로 설정하지 않으면 이 취약점을 피할 수 있음

Funny Video ^^

한번 웃어 보아요.

fckeditor 사용 방법

1. 다운 로드 및 설치

 - 여기(http://www.fckeditor.net/download) 최신 버전을 다운 받음
 - WebRoot/fckeditor 디렉토리 카피
 - WEB-INF/lib에 fckeditor-java-core-2.4-beta-1.jar 추가해 줌

2. 편집 메뉴 수정을 원할 경우

 - fckeditor/fckconfig.js 파일 편집
  . 기존에는 FCKConfig.ToolbarSets["Default"], FCKConfig.ToolbarSets["Basic"] 두개의 툴바가 있었으나 Basic은 너무 기능이 적고, Default는 너무 기능이 많고, 로딩 속도 또한 느려서 사용자 정의 ToolbarSets을 추가해 줄 수가 있음
FCKConfig.ToolbarSets["Middle"] = [
['Cut','Copy','Paste','PasteText','PasteWord','-','SpellCheck'],
['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],
['Link','Unlink'],
['FitWindow','Source'],
'/',
['Bold','Italic','Underline','StrikeThrough'],
['OrderedList','UnorderedList','-','Outdent','Indent'],
['JustifyLeft','JustifyCenter','JustifyRight','JustifyFull'],
['Image','Flash','Table','Rule','SpecialChar','PageBreak']
] ;
3. 화면 적용

 - 아래의 코드를 웹 소스에 적용함

#springBind("contents")
<textarea rows="10" cols="60" id="contents" name="contents">$!{status.value}</textarea>
$!{status.value}</textarea> //해당 컨텐츠 내용을 불러옴
<script type="text/javascript">
var oFCKeditor = new FCKeditor('contents');
oFCKeditor.BasePath = "http://mimul.com/fckeditor/";
oFCKeditor.Width = 540;
oFCKeditor.Height = 300;
oFCKeditor.ToolbarSet = "Middle";//새로 정의한 ToolbaSet
oFCKeditor.CheckBrowser = true;
oFCKeditor.ReplaceTextarea();
</script>
4. 실행화면

태그 :

[배명복 시시각각] 노무현의 굴레

집권 여당 대표의 입에서 ‘화불단행(禍不單行)’이란 말이 나올 정도로 뭐 하나 제대로 풀리는 일이 없다. 경제는 위기 상황이고, 외교는 곳곳에서 구멍을 드러내고 있다. 외교는 굽신, 경제는 불신, 남북 관계는 망신이어서 삼신할미도 포기한 ‘삼신 정부’란 말까지 나왔다. 한마디로 총체적 난국이다.

모든 것을 떠나 대통령을 보좌하고 있는 참모진의 문제가 가장 크다. 대한민국 최고의 인재가 모여 있어야 할 청와대에 3류급 범재와 둔재들이 설치고 있으니 나라가 제대로 굴러갈 리 없다. 비록 노무현 전 대통령의 어제 ‘항복 선언’으로 수습 국면을 맞긴 했지만 청와대 참모진의 수준을 보여주는 단적인 사례가 코미디 같은 ‘봉하마을 괴담’이었다.

노무현 전 대통령이 남긴 수백만 건의 대통령 기록물이 봉하마을의 사저에 가 있는 것은 오래전에 확인된 사실이다. ‘대통령 기록물 관리에 관한 법률’의 명백한 위반이다. 봉하마을 측은 법에 따라 원본은 국가기록원에 다 이관했고, 자신들은 사본만 갖고 있다면서 법에 보장된 전직 대통령의 배타적 열람권만 확보되면 언제든 반환하겠다는 입장을 취했었다. 그때까지 잠정적으로 사본을 갖고 있을 뿐이라는 주장이었다.

결국 사건이 검찰 손으로 넘어가기 직전, 노 전 대통령이 자료 일체를 반환하겠다고 물러섬으로써 일단락되긴 했지만 이 문제는 처음부터 국가기록원과 봉하마을 사이에 해결할 문제였다. 그런데도 청와대는 노 전 대통령 측이 청와대 서버를 통째로 가져갔느니, 해킹으로 인한 국가 기밀 누출이 우려된다는 등 괴담 수준의 각종 의혹을 제기하며 봉하마을을 압박해 왔다. 전임 대통령을 국기 문란의 중범죄를 저지른 흉악범으로 몰아가는 분위기였다.

제대로 된 참모라면 애초에 국가기록원을 내세워 문제를 해결토록 하고 청와대는 뒤로 빠지는 모양새를 취했을 것이다. 그런데도 청와대 관계자라는 익명에 숨어 계속해서 언론 플레이를 하며 펌프질을 해댔으니 전임 대통령을 흠집 내려는 비열한 정치 공작 아니냐는 의심을 산 것이다.

국정은 위기 상황인데 전임자 때리기에 열중하는 청와대를 보면서 사람들이 무슨 생각을 했을지 고민해 봤는지도 의문이다. 지금 국면에서 봉하마을 문제가 그토록 화급한 현안이었을까. 그러니 국면 전환용이니, 봉하마을이 준비 중인 시민참여형 토론 사이트인 ‘민주주의 2.0’이 ‘제2의 아고라’가 되는 것을 막기 위한 공작이라느니, 친노(親盧) 세력의 재결집을 막기 위한 포석이라느니, 노무현의 정치 재개를 차단하기 위한 음모라느니…, 별의별 소리가 다 나온 것이다.

봉하마을을 압박해 결국 항복을 받아낸 참모는 한 건 했다고 지금 쾌재를 부르고 있을지 모르겠지만 정말 그렇다면 그는 하나만 알고 둘은 모르는 숙맥이 틀림없다. 국론을 통합하고, 힘을 모아도 모자랄 판에 분열과 갈등을 조장하는 짓을 한 셈이니 그게 과연 대통령에게 득이 되었겠느냐 이 말이다. 간계(奸計)만 있지 지혜가 없는 탓이다. 무능함보다 무서운 것이 비겁함이다.

혹시라도 이 대통령이 “무조건 노무현이 한 것과 반대로만 하면 된다”는 세간의 농담에 홀렸다면 정말 한심한 일이다. 그가 할 일은 하루빨리 노무현의 굴레에서 벗어나는 것이다. 그는 이미 지나간 버스다. 배척하지 말고 끌어안는 통 큰 모습을 보이는 것이 이기는 길이고, 난국에서 벗어나는 길이다.

필요한 인재를 폭넓게 골라 쓸 수 있는 것은 대통령의 특권이다. 그들이 마음껏 능력을 발휘케 하는 것도 중요하지만 무능하면서 비겁한 참모를 가려내는 것도 못지않게 중요하다. 쓸데없는 데 공력을 낭비하고, 국론 분열을 조장하는 참모라면 경계해야 한다. 볼썽사나운 신구 정권 정면 대결 양상으로 치닫던 봉하마을 괴담 파문은 이제 이쯤에서 정리하는 것이 옳다. 그것이 이 대통령은 물론이고 나라에도 도움이 되는 길이다. 국민은 갈등을 더 이상 원치 않는다.

lambdaprobe로 Tomcat 모니터링

1. 다운로드 및 설치

 - 다운로드 사이트 : http://www.lambdaprobe.org/d/download.htm
 - probe.war 파일을 webapps에 카피함
 
2. 설정
 - conf/tomcat-users.xml 편집
<role rolename="poweruser"/>
<role rolename="probeuser"/>
<role rolename="poweruserplus"/>
<user username="admin123" password="xxxx" roles="manager,admin
,poweruser,poweruserplus,probeuser"/>

3. 모니터링 내용
 - Applications, Data Sources, Deployment, Thread, Cluster, System Information, Connector Status 등의 성능 정보를 보여줍니다.

 4. 모니터링 화면

[2008-08-09] 올림픽 종합



위의 도표를 보듯이 한국이 대회 1일째(8/9) 3위입니다. 3위 기념으로 포스팅합니다. 대~ 한민국 짝짝짝짝
대회 금메달만을 본다면...

  • 남자 도로 사이클: SANCHEZ Samuel(금-스페인), REBELLIN Davide(은-이탈리아), CANCELLARA Fabian(동-스웨덴)
  • 여자 개인 사브레 펜싱 : ZAGUNIS Mariel(금-미국), JACOBSON Sada(은-미국), WARD Becca(동-미국)
  • 남자 60kg 유도 : 최민호(금-한국), PAISCHER Ludwig(은-오스트리아), SOBIROV Rishod(동-우즈베키스탄), HOUKES Ruben(동-네델란드)
  • 여자 48kg 유도 : DUMITRU Alina Alexandra(금-루마니아), BERMOY Yanet(은-쿠바), PARETO Paula Belen(동-아르헨티나), TANI Ryoko(동-일본)
  • 남자 10M 공기 소총 : PANG Wei(금-중국), 진종호(은-한국), 김종수(동-북한)
  • 여자 10M Air Rifle : EMMONS Katerina(금-체코), GALKINA Lioubov(은-러시아), PEJCIC Snjezana(동-크로아티아)
  • 여자 48kg 역도 : CHEN Xiexia(금-중국), OZKAN Sibel(은- 터키), CHEN Wei-Ling(동-대만), 임정화 선수는 몸무게 0.51차이로 4위
[참조 사이트]
  • 베이징 공식 웹사이트 : http://en.beijing2008.cn/

UrlRewriteFilter 사용

c 소스 기반의 mod_rewrite의 내용을 Java버전으로 컨버팅한 Url Rewrite Filter를 사용하기 위한 정보를 공유합니다.

1. 다운로드 및 설치
 - 다운로드 사이트에서 최신판 다운 로드 : http://tuckey.org/urlrewrite/#download
 - WEB-INF/lib에 jar파일 카피

2. 설정
 - WEB-INF/web.xml

    <filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite
.UrlRewriteFilter</filter-class>
<init-param>
<param-name>logLevel</param-name>
<param-value>WARN</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
 - WEB-INF/urlrewrite.xml

    <rule>
<from>^/([0-9a-zA-Z]+)($|\/$)</from>
<to>/member?username=$1</to>
</rule>
 - WAS(tomcat) 리스타트

3. 설정 설명
 - http://www.mimul.com/pepsi가 호출되면 서버 내부에서는 자동으로 http://www.mimul.com/member?username=pepsi로 전환되어 호출된다.
 - <to type="forward"> : 사용자의 호출 path가 사용자에게 그대로 노출되고 내부적으로 바뀌어서 처리됨
 - <to type="redirect"> : 사용자의 호출 path가 해당 매핑 path로 전환되어 처리됨
 - Browser detection 기능도 가능

    <rule>
<condition name="user-agent">Mozilla/[1-4]</condition>
<from>/some/page.html</from>
<to>/some/page-for-old-browsers.html</to>
</rule>
4. 정규식 설명
  • . (any character)
  • * (zero of more of the preceding)
  • + (one or more of the preceding)
  • {} (minimum to maximum quantifier)
  • ? (ungreedy modifier)
  • ! (at start of string means "negative pattern")
  • ^ (start of string, or "negative" if at the start of a range)
  • $ (end of string)
  • [] (match any of contents)
  • - (range if used between square brackets)
  • () (group, backreferenced group)
  • | (alternative, or)
  • \ (the escape character itself)

[Mysql] MyISAM 테이블에서의 데이터 로드 방법

MyISAM 테이블에서 데이터를 로드할 경우 좀 더 성능있게 올릴 수 있는 방법을 공유합니다. 특히 많은 데이터를 로드할 경우 유용합니다.

1. local_infile ON 인지 확인

mysql> show variables like '%infile%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile | ON |
+---------------+-------+
1 row in set (0.00 sec)
2.  이관할 데이터 다운

 - Oracle에서 데이터 받을 경우

oracle>set pages 0;
set lin 200
set term off
set trims on
spool off

spool post.txt
select '"'||E_WA||'","'
||E_CITY||'","'||E_SECTION||
'","'||E_VILLAGE||'","'||
E_ADDRESS||'","'||E_HUGEADDR||'","'||
E_F1||'","'||E_F2||'","'||E_ZIPCODE||'","'||
E_DIST||'"'
from ZIPTBL;
spool off;
 - mysql에서 데이터 받을 경우

mysql>select E_WA, E_CITY, E_SECTION, E_VILLAGE,
E_ADDRESS, E_HUGEADDR, E_F1,
E_F2, E_ZIPCODE, E_DIST
into outfile "/home/k2/post.txt"
fields terminated by ','
enclosed by '"'
lines terminated by '\n'
from ZIPTBL;
3. utf-8 변환 (UltraEditor)

 - 파일>변환?ASCII -> UTF-8 선택 후 저장

4. 로드에 필요한 성능 설정

 - 성능 변수 조회

mysql> show variables like '%buffer%';
+-------------------------------+----------+
| Variable_name | Value |
+-------------------------------+----------+
| bulk_insert_buffer_size | 8388608 |
| innodb_buffer_pool_awe_mem_mb | 0 |
| innodb_buffer_pool_size | 8388608 |
| innodb_log_buffer_size | 1048576 |
| join_buffer_size | 131072 |
| key_buffer_size | 16777216 |
| myisam_sort_buffer_size | 8388608 |
| net_buffer_length | 8192 |
| preload_buffer_size | 32768 |
| read_buffer_size | 258048 |
| read_rnd_buffer_size | 520192 |
| sort_buffer_size | 524280 |
+-------------------------------+----------+
12 rows in set (0.00 sec)
 - 성능 설정

mysql> set session BULK_INSERT_BUFFER_SIZE=256217728;
Query OK, 0 rows affected (0.00 sec)

mysql> set session MYISAM_SORT_BUFFER_SIZE=256217728;
Query OK, 0 rows affected (0.00 sec)

mysql> set global KEY_BUFFER_SIZE=256217728;
Query OK, 0 rows affected (0.05 sec)

mysql> alter table ziptbl disable keys;
Query OK, 0 rows affected (0.00 sec)
5. 데이터 로드

 - 데이터 로드

mysql>LOAD DATA INFILE '/home/k2/post.txt'  
INTO TABLE post FIELDS TERMINATED BY ','
ENCLOSED BY '"' LINES TERMINATED BY '\n'
(e_wa,e_city,e_section,e_village,e_address,
e_hugeaddr,e_f1,e_f2,e_code,e_dist);
Query OK, 4675823 rows affected (1 min 15.05 sec)
Records: 4675823 Deleted: 0 Skipped: 0 Warnings: 0
 - 기존 설정으로는 3분 30초 나왔음
 - 기존 설정 원복
mysql> alter table ziptbl enable keys;
Query OK, 0 rows affected (0.00 sec)
태그 :

ROME을 활용해서 Feed 생성하기

ROME과 Spring을 활용해서 Feed를 생성하는 소스입니다. 블로그 시스템을 개발하거나 기존 게시판 서비스에서 Feed를 만들어서 외부에 공유해 주기위해서 아래 소스들을 활용하면 원하시는 Feed를 생성할 수 있을 것입니다.
ROME이 여러모로 좋은 오픈소스로 활용되는 것 같네요. 좀더 분석해서 필요한 기능들을 공유할께요.
필요한 라이브러리는 ROME 1.0, JDOM 1.0이 필요합니다.

1. Feed 생성 소스

package client;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.mimul.DataFacade;
import com.mimul.domain.Category;
import com.mimul.domain.Entry;
import com.mimul.domain.SiteConfig;
import com.sun.syndication.feed.synd.SyndCategory;
import com.sun.syndication.feed.synd.SyndCategoryImpl;
import com.sun.syndication.feed.synd.SyndContent;
import com.sun.syndication.feed.synd.SyndContentImpl;
import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndEntryImpl;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.feed.synd.SyndFeedImpl;

public class CreateFeed
{
private final Log log = LogFactory.getLog(this.getClass());
private DataFacade dataFacade;

public void setDataFacade(DataFacade dataFacade) {
this.dataFacade = dataFacade;
}

public SyndFeed getFeed(String type)
{
SyndFeed feed = null;
Entry post = null;
List<Entry> recentEntries = null;
List<SyndEntry> entries = null;
List<SyndCategory> categories = null;
StringBuilder sb = null;

try {
feed = new SyndFeedImpl();
feed.setFeedType(type); //rss_2.0
feed.setTitle("Mimul's Developer World");
feed.setLink("http://www.mimul.com/");
feed.setDescription("Java Ecxamples Code");
entries = new ArrayList<SyndEntry>();

post = new Entry();
post.setType("post");
post.setEntryStatus("publish");
// 데이터 베이스에 저장된 엔트리를 가져온다
recentEntries = dataFacade.getEntryPage(post,
10, 0, null, null).getItems();

for (Entry entry:recentEntries) {
SyndEntry syndEntry = new SyndEntryImpl();
syndEntry.setTitle(entry.getTitle());
String link = null;
if(StringUtils.isNotBlank(entry.getName())) {
link = "http://www.mimul.com" + "/post/" +
entry.getName() + ".html";
}else{
link = "http://www.mimul.com" + "/post/id/" +
entry.getId() + ".html";
}
syndEntry.setLink(link);
syndEntry.setAuthor(entry.getAuthor().getNickname());
syndEntry.setPublishedDate(entry.getPostTime());
categories = new ArrayList<SyndCategory>();
// 카테고리 정보를 가져온다
for(Category category:entry.getCategories()) {
SyndCategory syndCategory = new SyndCategoryImpl();
syndCategory.setName(category.getName());
syndCategory.setTaxonomyUri("http://www.mimul.com" +
"/category/" + category.getName() + "/");
}
syndEntry.setCategories(categories);
SyndContent content = new SyndContentImpl();
content.setType("text/html");
sb = new StringBuilder();
sb.append(entry.getSummary())
.append("<p>").append("<a href=\"").append(link)
.append("\">[more..]</a></p>");
content.setValue(sb.toString());
syndEntry.setDescription(content);
entries.add(syndEntry);
}
feed.setEntries(entries);
} catch (Exception e) {
log.error(e);
}
return feed;
}
}
2. Servlet 소스

public void doPost(HttpServletRequest request, 
HttpServletResponse response)
throws ServletException, IOException {
SyndFeedOutput output = null;
try {
SyndFeed feed = getCreateFeed().getFeed("rss_2.0");
feed.setFeedType("rss_2.0");

response.setContentType("application/xml; charset=UTF-8");
response.setHeader("Pragma","No-Cache");
response.setHeader("Cache-Control","No-Cache");
response.setDateHeader("Expires",0);

output = new SyndFeedOutput();
output.output(feed, response.getWriter());
} catch (FeedException e) {
log.error(e);
response.sendError(
HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
"FEED 생성 오류");
}
}
private CreateFeed getCreateFeed() {
return (CreateFeed) WebApplicationContextUtils.
getWebApplicationContext(getServletConfig()
.getServletContext()).getBean("createFeed");
}
태그 :

빌 게이츠가 전하는 인생이야기

한번 보세요. 느낌을 공감해 보심이....
태그 :

PHP 최적화 Tips

1. 데이터 출력 부분
 - print보다는 echo가 빠르다.(참고)
 - concatenation시에 double quotes(")보다는 Single quotes (')가 빠르다.(참고)
  예) echo "내이름은 $name";보다는 '내이름은 ' . $name; 를 사용
 - concatenation시에 string concatenation보다는 multiple parameters 방식을 사용하라(참고)
  예) echo '변수의' . '값은' . $variable . '입니다.'; 보다는 echo '변수의', '값은', $variable, '입니다.';를 사용하라

2. Loops와 Counting
 - for loop구문에서 max값은 미리 지정하라(참고)
  예) for ($i = 0; $i < count($array); $i++) 보다는 $max = count($array);for ($i = 0; $i < $max; $i++)방식을 사용하라
 - strlen보다는 isset을 사용하라(참고)
 - 증가 pre-incrementing 방식을 사용하라(참고)
  예) $i++; 보다는 ++$i;

3. Variables과 Functions
 - array를 사용할 경우 free memory를 작업을 처리하기 위해 Unset or null을 사용하라(참고)
 예)
 $fp = fopen("access.log", "r");
 while ($row = fgets($fp, 10000)) :
    $text = $text.$row;
    $i++;
    if ($i > 5000) {
        print_r(getrusage());
        unset($text);
        $text = $row;
        unset($i);
        $i = 0;
        }
    unset($row);
 endwhile;
 - require_once()보다는 require()를 사용하라(참고)
 - includes and require를 사용할 경우 전체 경로를 지정하라(참고)
  예) include('test.php'); 보다는 include('http://www.mimul.com/test.php');
 - "switch/case"문 보다는 "else if" 문을 사용하라(참고)

4. 그 외
 - @는 속도가 느려서 사용하지마라(참고)
 예) $variable = @$variable1; 보다는
     if (isset($variable1))  $variable = $variable1;
     else                $variable = NULL; 사용하라
 - <?..?>, <% ..%>보다는 <?php … ?> tags를 사용하라(참고)
 - mysql_real_escape_string응 사용하라(참고)
 - $_POST, $_SERVER 등의 변수 보다는 mysql_real_escape_string, htmlspecialchars를 사용하라. 사용을 한다면 보안 이슈가 발생한다.
  예) echo htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);와
  $query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
            mysql_real_escape_string($user),
            mysql_real_escape_string($password)); 같은 방식을 사용하라
 - 패스워드 사용시에는 평문을 사용하지 말고 해쉬 함수를 사용하라(참고)
 예) $user_password = 'testest';
      if (md5($user_password) == $md5_password_from_database) {
         //login here...
      }
 - ip 정보는 문자열 방식보다는 숫자 방식[ip2long(), long2ip()]으로 저장하라(참고)
 - 자주 변경되지 않는 것들은 캐싱 라이브러리(Smarty, Cache Lite)를 통해 캐싱한다.(