<< 4월 2008 | | 6월 2008 >>

Spring, Hibernate, Velocity를 활용한 페이징 기법

Hibernate에서 지원되는 페이징 알고리즘을 적용하는 방법을 공유합니다. 이것을 활용함으로써 우린 게시판 등에 응용할 수 있습니다. 테이블명과 도메인 객체는 site라고 가정합니다.
아래는 구현하기 위한 내용을 기술합니다.

1. PaginationSupport class추가
 - 클래스의 내용은 여기에서 다운 받으시기 바랍니다.

2. DaoFacade Implementation class 추가
 - Data 가져오는 부분..
@SuppressWarnings("unchecked")
public PaginationSupport<Site> getSitePage(Site site, int pageSize,
int startIndex, String order, Boolean isDesc) {
DetachedCriteria criteria = DetachedCriteria.forClass(Site.class);
criteria.add(Restrictions.eq("user.id", site.getUser().getId()));
if (StringUtils.isNotBlank(order)) {
if(isDesc == null || !isDesc){
criteria.addOrder(Order.asc(order));
}else{
criteria.addOrder(Order.desc(order));
}
} else {
criteria.addOrder(Order.desc("authTime"));
}
return this.findPageByCriteria(criteria, pageSize, startIndex);
}

3. SiteController class작성
 - 이 클래스는 사이트 테이블의 리스트를 보여주는 클래스입니다.
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
String p = tu.isNull(request.getParameter("p"), "1");
int currentPage = 1;
if(NumberUtils.isNumber(p)){
currentPage = Integer.parseInt(p);
}
if(currentPage < 1)
currentPage = 1;
site = new Site();
user = new User();
user.setId(userSession.getUserId());
site.setUser(user);
PaginationSupport<Site> page =
this.daoFacade.getSitePage(site, 10, (currentPage - 1)
* 10, null, null);
ModelAndView mv = new ModelAndView();
mv.addObject("page", page);
mv.addObject("p", p);
mv.setViewName("sites");
return mv;
}

4. velocity viewer 작성
 - 게시판 리스트 보여주는 viewer입니다.
<fieldset>
<legend>#springMessage("sites")</legend>
<table class="list">
<tr>
<th>#springMessage("message.site.realm")</th>
<th>#springMessage("message.site.approve")</th>
<th>#springMessage("message.site.confirmedtime")</th>
<th>#springMessage("message.site.remoteaddr")</th>
<th>#springMessage("message.site.authtime")</th>
</tr>
#foreach($site in $page.items)
<tr>
<td>$!{site.realm}</td>
<td>$!{site.approve}</td>
<td>$!{site.confirmedTime}</td>
<td>$!{site.remoteAddr}</td>
<td>$!{site.authTime}</td>
</tr>
#end
</table>
<div class="pages">
#if($page.currentPage > 1)
<a href="sites?p=$!{page.currentPage}-1">&#171; previous</a>
#end
#foreach($pages in $page.pages)
#if ($!{pages} == $!{page.currentPage})
<span class="current">$!{pages}</span>
#elseif($!{pages} == 0)
<span>...</span>
<#else><a href="sites?p=$!{pages}">$!{pages}</a>
#end
#end
#if($!{page.currentPage} > 0 &&
$!{page.currentPage} < $!{page.totalPage})
<a href="sites?p=$!{page.currentPage}+1">next &#187;</a>
#end
</div>
</fieldset>

mysql++ 사용기

C 로 MySQL 5 Stored Procedure 사용하거나 어플리케이션 배치 혹은 서버 구현을 위해서 필요할 시에 이 프레임워크를 사용하게 됩니다.
물론 SQLRelay 사용도 하나의 방편이 되죠.

1. 다운 받기

 - wget http://www.tangentsoft.net/mysql++/releases/mysql++-3.0.3.tar.gz
 - 과거에는 1.7.9 였는데 이번에 가보니 3.0.3으로 업그레이드 되어 있네요. 그래서 과거의 일부 함수는 사용불가할 겁니다. 컨버전이 필요합니다. ^^

2.  설치하기

 - mysql++-3.0.3>./configure --prefix=/database/mysqlpp --with-mysql=/database/mysql
 - mysql++-3.0.3> make
 - mysql++-3.0.3> make install

install을 하게되면 /database/mysqlpp/lib에 libmysqlpp.so 설치됨

3. 어플리케이션 샘플 작성

 - #include <mysql++.h> 추가 하고 아래와 같이 샘플 예제 구현
const char* db = 0, *server = 0, *user = 0, *pass = "";
poolptr = new SimpleConnectionPool(db, server, user, pass);
try {
mysqlpp::Connection* cp = poolptr->grab();
if (!cp) {
cerr << "Failed to get a connection from the pool!!"<<endl;
return 1;
}
mysqlpp::Query query(cp->query("select * from stock"));
mysqlpp::StoreQueryResult res = query.store();
for (size_t j = 0; j < res.num_rows(); ++j) {
cout << '\t' << res[i][0] << endl;
}
poolptr->release(cp);
}
catch (mysqlpp::Exception& e) {
cerr << "Failed to set up initial pooled connection: " <<
e.what() << endl;
return 1;
}
태그 :

MySQLTuner 사용기

이 스크립트는 mysql 튜닝 포인트 정보를 실 운영되는 mysql서버를 접속하여 정보를 수집하여 결과를 보여줍니다. 조금은 미흡하지만 간력한 정보들을 파악하여 mysql의 튜닝 포인트를 한번 짚어보세요.

1. 사용 방법

>wget http://mysqltuner.com/mysqltuner.pl
>chmod +x mysqltuner.pl
>su - root
>./mysqltuner.pl

2. 결과 내용

저의 개인용 mysql 정보입니다. 설정부분을 수정해주어야 할 부분이 보이죠. ^^
-------- General Statistics --------------------------------------------------
[OK] You have the latest version of MySQLTuner
[!!] Your MySQL version 4.1.21 is EOL software! Upgrade soon!
[OK] Operating on 32-bit architecture with less than 2GB RAM

-------- Storage Engine Statistics -------------------------------------------
[--] Status: -Archive -BDB -Federated +InnoDB -ISAM -NDBCluster
[!!] InnoDB is enabled but isn't being used

-------- Performance Metrics -------------------------------------------------
[--] Up for: 165d 1h 52m 10s (18M q [1.300 qps], 671K conn, TX: 2B, RX: 766M)
[--] Reads / Writes: 84% / 16%
[--] Total buffers: 1.6M per thread and 42.0M global
[OK] Maximum possible memory usage: 197.5M (9% of installed RAM)
[OK] Slow queries: 0% (0/18M)
[OK] Highest usage of available connections: 41% (41/100)
[!!] Cannot calculate MyISAM index size - re-run script as root user
[!!] Query cache is disabled
[OK] Sorts requiring temporary tables: 0%
[OK] Temporary tables created on disk: 5%
[!!] Thread cache is disabled
[!!] Table cache hit rate: 0%
[OK] Open file limit used: 12%
[OK] Table locks acquired immediately: 100%

-------- Recommendations -----------------------------------------------------
General recommendations:
Add skip-innodb to MySQL configuration to disable InnoDB
Enable the slow query log to troubleshoot bad queries
Set thread_cache_size to 4 as a starting value
Increase table_cache gradually to avoid file descriptor limits
Variables to adjust:
query_cache_size (>= 8M)
thread_cache_size (start at 4)
table_cache (> 64)
태그 :

아이팟 - 말할 수 없는 비밀

요즘은 출퇴근 시간에 짬을 내어 아이팟 비디오로 영화를 봅니다. 요즘 본 영화중에 기억에 남는 영화가 있어 소개해 합니다. 시간이 되시면 한번 보세요. 강추입니다.
그리고 연인들이 보면 애정 전선에 더더욱 도움이 되죠.

이 영화는 만능 엔터테이너인 주걸륜이 각본, 감독, 주연까지 맡은 감독 데뷔작입니다.
시간을 초월한 사랑인 시월애, 동감을 한편 더 본 듯한 느낌, 분위기는 클래식을 연상케하는.. Nodame Cantabile도 기억나고..
전체적으로 음악이 우리에게 주는 즐거움을 모두 담아 놓아 강한 여운이 남는 영화입니다.

내용을 간략하게 설명해 드리면 초반부에 피아노 배틀 장면은 이야기가 약한 영화에 힘을 실어 주었고, 예술학교 근처에서 벌어지는 아기 자기한 에피소드를 배치하여 군더더기 없는 잔잔한 멜로를 선사하였네요.

저만의 느낌이라면 한 없이 끌릴 수 밖에 없는 여배우의 투명한(또는 순수한) 매력에 빠져 버렸답니다.

또한, 주걸륜의 현란한 피아노 연주 실력도 엿볼 수 있었고 황추생의 연기는 조폭물을 벗어나니 오히려 더 뛰어나 보이는 듯하고.

이 영화를 계기로 한국에서는 주걸륜 팬 카페도 생기고..현지에서의 주걸륜의 인기는 하늘을 찌르고 있다네요.

무료 JavaScript 개발 툴

1. Spket IDE
 - JavaScript와 XML의 개발을 쉽게 해주는 이클립스에 플러그인 .
 - AJAX Library : ExtJS, jQuery, YUI
 - 다운로드 사이트 : 여기에서 받으세요.
 - 사용 방법 : 여기에서 보세요. 

2. Apatana
 - JavaScript 개발 툴
 - AJAX Library : ExtJS, jQuery, YUI, Scriptaculous, dojo, aflax, prototype, rico, Adobe Spry, mootools 지원
 - 다운로드 사이트 : 여기에서 받으세요.
 - 사용 방법 : 여기에서 보세요.

3. JSEclipse
 - Adobe에서 만든 JavaScript 개발 툴
 - AJAX Library : Dojo, Prototype, Spry, YUI, Qooxdoo
 - 다운 로드 사이트 : 여기에서 받으세요.

4. JSDT
 - JavaScript IDE로 디버깅까지 가능
 - AJAX Library : 지원 예정
 - 사용 방법 : 여기에서 보세요.

SitePoint에서 무료 Photoshop 책 받기

photoshop무료기간이 끝나기전에...
여기 사이트에 가서  "The PhotoShop Anthology"를 받으시기 바랍니다.

받는 방법은 다운로드 버튼을 클릭한 다음,

이메일로 다운로드 링크를 보내주면 그 URL을 카피해서 다운 받으시면 됩니다.

책의 구성은 9 Chapters, 270 페이지로 구성되어 있습니다.

Chapter 1 Getting Started with Photoshop.
Chapter 2 Basic Skills
Chapter 3 Creating Buttons
Chapter 4 Creating Backgrounds
Chapter 5 Working with Text
Chapter 6 Adjusting Images
Chapter 7 Manipulating Images
Chapter 8 Designing a Web Site
Chapter 9 Advanced Photoshop Techniques

필요하신 분들은 다운받아서 사용하세요. 물론 프린트 기능은 됩니다.
태그 :

웹 애플리케이션에 필요한 필터 - UrlRewriteFilter 필터

미니홈피 등의 사이트 구성시 url을 사용자 아이디 단위로 일정한 URL로 표시하기 위해서 편리한 방법은 UrlRewriteFilter를 사용하는 것입니다. UrlRewriteFilter를 사용하기 위한 절차를 아래에 작성해 두니 필요하신 분들은 잘 사용하세요.

1. 라이브러리 다운 로드

 - UrlRewriteFilter
 
2. WEB-INF/web.xml 추가
<filter>
<filter-name>rewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.
urlrewrite.UrlRewriteFilter</filter-class>
<init-param>
<param-name>logLevel</param-name>
<param-value>INFO</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3. WEB-INF/urlrewrite.xml 추가
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN"
"http://tuckey.org/res/dtds/urlrewrite3.0.dtd">

<!-- https://urlrewrite.dev.java.net/manual/3.0 -->
<urlrewrite use-query-string="true">
<rule>
<from>^/index/([0-9]+).html$</from>
<to type="forward">/index.jhtml?p=$1</to>
</rule>
<rule>
<from>^/search/([^/]+)/$</from>
<to type="forward">/search.jhtml?query=$1</to>
</rule>
</urlrewrite>
유입 규칙(Inbound Rules)과 유출 규칙(Outbound Rules)을 적절하게 사용하시기 바랍니다.

4. WEB-INF/spring.xml 수정
<bean id="urlMapping" 
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="localeChangeInterceptor"/>
<ref bean="noCacheHeaderINterceptor"/>
</list>
</property>
<property name="mappings">
<props>
<prop key="/index.jhtml">indexController</prop>
<prop key="/search.jhtml">searchController</prop>
</props>
</property>
</bean>

MySQL UDF를 활용한 사용자 정의 함수 추가

1. 추가항 함수 구현

 - syslogudf.c 파일에 기능 구현
#include <mysql.h>
#include <string.h>
#include <syslog.h>

my_bool logger_init(UDF_INIT *initid, UDF_ARGS *args,
char *message) {
initid->maybe_null=0;
return 0;
}

long long logger(UDF_INIT *initid, UDF_ARGS *args,
char *is_null, char *error) {
if (args->arg_count != 1) {
strcpy(error, "LOGGER(): needs message");
return 1;
}

if (args->arg_type[0] != STRING_RESULT) {
strcpy(error, "LOGGER() message
should be string");
return 1;
}

syslog(LOG_INFO,"%s",args->args[0]);
*is_null = 0;
*error = 0;

return 0;
}
2. 컴파일
gcc -I /usr/include/mysql/ -shared -o 
syslogudf.so syslogudf.c
3. mySQL에 함수 추가를 위한 so로드
mysql> create function logger returns 
integer soname 'syslogudf.so';
Query OK, 0 rows affected (0.00 sec)
4.테스트

 - 임의로 syslog떨어뜨리기 위한 쿼리 만들어서 실행함
mysql> select logger(concat(user()," wishes you ",
-> if(rand()>0.3,"good","bad")," luck"));
5. syslog 결과
$ tail -1 /var/log/messages
May 12 15:57:09 mimul sshd(pam_unix)[26045]: authentication failure;
logname= uid=0 euid=0 tty=NODEVssh ruser= rhost=202.96.189.83
May 12 15:57:11 mimul mysqld max: root@mimul wishes you bad luck
태그 :

Internet Trends 2008 - Morgan Stanley

세계적인 투자은행인 모건 스탠리의 기술 리서치에서 새로운 인터넷 트렌드 리포트를 발표하였습니다.

[지난 자료 리스트]

영화 - 테이큰(2008, Taken) 관람

taken프랑스를 대표하는 뤽베송(그랑브루, 레옹, 제5원소, 택시)이 제작과 각본을 담당했고, 감독은 피에르 모렐(13구역)입니다.

전체 내용을 살펴보면..

파리로 여행을 떠난 딸(매기 그레이스)이 납치당한 후, 아무런 이유도, 단서도 없는 상황에서 전직 특수 요원 출신 아버지(리암 니슨-쉰들러 리스트에도 나왔죠..)가 벌이는 프로페셔널한 추격전을 그린 영화 입니다.

특수 요원으로 활동했던 아버지가 남다른 방법으로 딸의 행방을 쫓는 과정에 초점을 맞추고 있습니다. 한가지 흠은 96시간동안 실수도 없이 범인들을 추적해 나가는 점 하나 빼고는 완벽한 스토리, 화면 구성, 배우들의 연기들이 잘  어우러져 있습니다.
개인적으로 강추 ^^

그리고 현실적으로 아버지가 딸이 유괴되었을 때 저렇게 책임감을 가지고 찾아올 수 있을지, 저 자신에게 심히 걱정이 됩니다. ^^
오랫만에 긴장감있게 영화를 봐서인지 그  감흥이 집에 왔을 때까지 남아 있네요.
하지만, 한가지 걱정은 4,5월이 한국영화는 최악의 달인듯 보입니다. 맥을 못치네요. 빨리 경쟁력있는 영화가 시장에 출시되기를 바랄께요.

웹 기반의 언어분석기

웹 기반으로 언어분석기를 소개합니다.무엇이냐 하면 웹에 기입한 문자가 어느 나라 언어인지 식별해 주는 기능입니다. 필요한 것은 아래 4개의 Javascript만 있으면 해결이 가능하구요.
  • analyze.js : 언어 분석 결과 보여 주고 처리하는 인터페이스 역할
  • newdata.gz.js :언어분석을 위한 데이터 파일
  • libs-1.gz.js : 라이브러리 종합
한글일 경우에는 자음만쓸 경우 분석을 못해주고 헤메고 있더라구요. 완벽하지는 않지만..
하지만, 인터넷상에서 돌아다니다가 이상한 문자가 있을 경우 카피해서 붙여 보세요.
어떤 나라의 언어인지 궁금하지 않으세요? ^^

아래는 예제 사이트입니다. 한번 테스트해보세요.
지원언어는 한국어를 포함하여 영어, 프랑스어, 독일어, 일본어, 중국어 등등의 다양한 언어가 식별이 가능한 것을 볼 수 있습니다.

  • 제 예제 사이트 : http://mimul.com/examples/language/
  • 참고 사이트 : http://henrikfalck.com/languageanalyzer/

HP aCC에서 ACE framework 설치 방법

1. 다운 로드

 - ACE-5.6.tar.gz

2. 설치 문서 위치

 - 일단 여기 사이트에서 참조하여 힌트를 얻음 
 - 설치 환경은 HP-UX B.11.31, aCC 버전 A.06.12

3. 제가 설치한 순서

 - Autoconf, m4 버전 확인 후 낮을 경우 설치
  - 환경 설정
   . setenv ACE_ROOT /home/k2/ACE_wrappers
 - vi $ACE_ROOT/ace/config.h
   . #include "ace/config-hpux-11.00.h" 추가 저장함
 - vi $ACE_ROOT/include/makeinclude/platform_macros.GNU
   . include $(ACE_ROOT)/include/makeinclude/platform_hpux_aCC.GNU 추가 저장함
 - setenv LD_LIBRARY_PATH $ACE_ROOT/lib:$LD_LIBRARY_PATH
 - setenv LPATH $ORACLE_HOME/lib:$ORACLE_HOME/lib32:/usr/lib/hpux64
 - 컴파일
   . gmake buildbits=64
 - $ACE_ROOT/lib에 shared library 컴파일됨

4. 기타

 - aCC A.06.12버전으로 오면서 64비트 옵션이 +DD64로 변경되었음
 --lxti 등에서 링킹 에러나는 경우 /usr/lib/hpux64를 LPATH에 추가해주면 해결됨

그외에 중간 중간에 오류나는 것에 대해서는 ldd <executable>, chatr <executable>를 통해 하나씩 원인을 찾아서 링크해주면 대부분 라이브러리는 컴파일 됨
삽질의 시간을 줄이도록 제가 한 내용을 공유합니다. 물론 환경에 따라 틀릴수도 있으니 이점 유의하세요.
태그 :

SAML 관련 정보

1. SAML 이해
  • SAML 개요  : http://en.wikipedia.org/wiki/SAML
  • OASIS : http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=security
2. 관련 오픈 소스
태그 :

개발 및 운영에 필요한 툴 - multitail

이 프로그램은 tail 커맨드를 여러 파일들을 한 화면에 보여주는 기능입니다. 참 유용합니다.

1. 다운로드 및 설치
 - 먼저 다운 받은 다음 리눅스일 경우 root권한으로 make install을 실행하시면 됩니다.
 - ncurses library가 필요합니다.

2. 가장 많이 사용하는 커맨드

*. 두개의 로그파일을 한 화면에서 조합해서 보여주는 커맨드
  - multitail /var/log/messages -I /logs/apache/access_log.1209859200



*. 두개의 로그파일을 두화면으로 나누어 보여주는 커맨드
  - multitail -s 2 /var/log/messages /logs/apache/access_log.1209859200



*. 프로그램을 빠져나가는 커맨드
 - q

다양한 샘플 커맨드는 여기에 가시면 다양하게 확장해서 보실 수 있습니다.
태그 :

Linux iotop

Guillaume Chazarain의 iotop.py을 활용하면 disk IO정보(disk read/write rate, swapins, total disk)를 top 커맨드와 유사한 포멧으로 상세하게 보여줍니다. 이 기능은 linux kernel 2.6.20이후에 IO계정이 생겨나면서 가능해진 것입니다.
DISK IO에 대한 상세한 정보를 보여주기 때문에 성능 이슈 해결에 도움을 줍니다.

이 프로그램을 수행하기 위해서는 아래와 같은 요구조건이 있습니다.

결과 화면은 아래와 같습니다.

iotop
태그 :

웹 애플리케이션에 필요한 필터 - 압축 필터

압축 필터는 인터넷을 통해서 웹 서버에서 사용자에게 보내는 컨텐츠의 크기를 최적화시켜 페이지 로딩 시간을 절약해 주는 효과를 볼 수 있습니다. 그만큼 네트워크 Bandwidth을 덜 차지하니깐요.
아래는 적용 방법을 공유합니다.

1. 기능 보완

아래의 참조 사이트를 참고하여 만든 소스입니다. 다운 받으실 수 있습니다.
추가된 내용은
  • GZIPFilter.isGZIPSupported(HttpServletRequest) 함수 수정
  • GZIPResponseWrapper.getWriter() 함수 수정
    // From cmurphy@intechtual.com to fix:
    // https://appfuse.dev.java.net/issues/show_bug.cgi?id=59
    if (this.origResponse != null && this.origResponse.isCommitted()) {
    return super.getWriter();
    }
  • GZIPResponseWrapper.sendError(int, java.lang.String) 함수 수정
  • 다운 로드 : GZIPResponseWrapper.java, GZIPResponseStream.java, GZIPFilter.java

2. web.xml 추가

이미지같은 경우는 압출할 경우 오히려 사이즈가 증가할 우려가 있으니 제외하는 것이 좋습니다.
<filter>
<filter-name>compressionFilter</filter-name>
<filter-class>com.mimul.web.filter.GZIPFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>compressionFilter</filter-name>
<url-pattern>*.css</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>compressionFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>compressionFilter</filter-name>
<url-pattern>*.js</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>compressionFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>


3. 관련 자료

 - 웹 성능 향상 개발 방법
 - Two Servlet Filters Every Web Application Should Have