2009년 9월 30일 수요일

HTML: HTML 5

http://vimeo.com/6691519
ie만 사라지면 아름다운 세상이 될듯...

2009년 9월 12일 토요일

java : regex

http://litlhope.springnote.com/pages/1786498

2009년 9월 10일 목요일

LINUX : vi 명령어

http://omen666.tistory.com/106

2009년 9월 3일 목요일

ORACLE : SYS_CONNECT_BY_PATH

순환쿼리를 이용해서 row를 합치거나 계층구조로 보여 줄 수 있다.

http://notgivuphil.tistory.com/tag/SYS_CONNECT_BY_PATH

2009년 9월 1일 화요일

XML : xstream 에서 double underscore 처리

XmlFriendlyReplacer xfr = new XmlFriendlyReplacer("_", "_");
XStream xstream = new XStream(new DomDriver("UTF-8", xfr));

이런식으로 리플레이서를 바꿔서 사용 할 수 있다.

참조 : http://jira.codehaus.org/browse/GRAILS-4167

2009년 8월 28일 금요일

LINUX: host 변경

vi /etc/hosts

맨날 잊어 먹는다..;;

telnet www.naver.com 80

/GET /test/test.html

2009년 6월 23일 화요일

아파치 톰켓 연동

http://openframework.or.kr/Wiki.jsp?page=Apache_tomcat_using_jk_on_linux

아파치 + 톰켓 (mod_jk)

2009년 6월 4일 목요일

.net : sql server 설치

http://spadework.co.kr/72
일단 DB 부터 설치 시작

2009년 4월 12일 일요일

AXIS: soap logging with log4j

client-config.wsdd로 soap로그를 남기는 것이 가능해졌지만 org.apache.axis.handlers.LogHandler는 common-logging을 사용하는 관계로 맘에 들지 않는다.
import org.apache.axis.handlers.BasicHandler를 상속받거나 handler를 구성(implement- 이건 한글로 뭐라 해야 되는지 항상 고민된다.)하면 간단하게 적용시킬 수 있다.


public class AxisLogHandler extends BasicHandler{
Logger logger = Logger.getLogger(AxisLogHandler.class);
public void invoke(MessageContext messageContext) throws AxisFault {
try{
logger.info(messageContext.getMessage().getSOAPBody() );
} catch (SOAPException e) { .....} }
}


대충 이정도만 해도 대충은 ... 쓸만하다.
구현 후 client-config.wsdd를 수정해 주면 된다.

2009년 4월 10일 금요일

LOG4J: log4j.properties 설정

프로퍼티 파일 위치는 class 폴더 (WEB-INF/class 같은) 또는 java -Dlog4j.configuration=file:/home/httpd/html/log4j.properties 같이 직접 지정.(http.sh 파일 등에)

log4j.rootLogger=DEBUG, stdout
log4j.logger.foo.boo=INFO, serviceInfo, serviceWarn, mail

#Console Log
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Threshold=INFO
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-5p at %C{3}.%M(%13F:%L) %3x - %m%n
#info level File Log
log4j.appender.serviceInfo=org.apache.log4j.DailyRollingFileAppender
log4j.appender.serviceInfo.Threshold=INFO
log4j.appender.serviceInfo.File=/home/httpd/log/interpark/serviceInfo.log
log4j.appender.serviceInfo.DatePattern='.'yyyy-MM-dd
log4j.appender.serviceInfo.layout=org.apache.log4j.PatternLayout
log4j.appender.serviceInfo.layout.ConversionPattern=[%d] %-5p at %C{3}.%M(%13F:%L) %3x - %m%n
#debug level File Log
log4j.appender.serviceWarn=org.apache.log4j.DailyRollingFileAppender
log4j.appender.serviceWarn.Threshold=WARN
log4j.appender.serviceWarn.File=/home/httpd/log/interpark/serviceWARN.log
log4j.appender.serviceWarn.DatePattern='.'yyyy-MM-dd
log4j.appender.serviceWarn.layout=org.apache.log4j.PatternLayout
log4j.appender.serviceWarn.layout.ConversionPattern=[%d] %-5p at %C{3}.%M(%13F:%L) %3x - %m%n
#mail는 SMTPAppender(SMTP 메일)에 출력
log4j.appender.mail=org.apache.log4j.net.SMTPAppender
log4j.appender.mail.Threshold=ERROR
log4j.appender.mail.BufferSize=512
log4j.appender.mail.SMTPHost=mail.foo.co.kr
log4j.appender.mail.SMTPUsername=foo
log4j.appender.mail.SMTPPassword=boo
log4j.appender.mail.TimeFrame=30
log4j.appender.mail.MaxEMails=10
log4j.appender.mail.From=foo@foo.co.kr
log4j.appender.mail.To=boo@boo.co.kr
log4j.appender.mail.Subject=장애 안내
log4j.appender.mail.layout=org.apache.log4j.PatternLayout
log4j.appender.mail.layout.ConversionPattern=%d{ISO8601} %5p [%t] (%F:%L) - %m%n

AXIS: XML LOG 기록

디버깅을 위해 요청 및 응답을 통해 생성되는 XML 코드를 캡처해야 하는 경우가 종종 있습니다. Java(Axis 사용), Python 및 Perl에서 생성된 XML을 캡처하는 방법은 다음과 같습니다.

Java - XML 결과물을 Apache Axis로 캡처
해당 파일을 Axis 클라이언트의 작업 디렉토리에 client-config.wsdd라는 이름으로 저장합니다. Axis에서 해당 파일을 자동으로 로드합니다. 아래와 같이 구성하면 Axis에서 모든 수신 및 전송 XML을 axis.log라는 파일로 저장합니다.


<!-- 해당 파일을 Axis 클라이언트의 작업 디렉토리에 "client-config.wsdd"라는 이름으로
저장합니다. Axis에서 해당 파일을 자동으로 로드합니다. 아래와
같이 구성하면 Axis에서 모든 수신 및 전송
XML을 "axis.log"라는 파일로 저장합니다.
-->

<deployment
xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

<handler name="log" type="java:org.apache.axis.handlers.LogHandler"/>

<globalConfiguration>
<requestFlow>
<handler type="log"/>
</requestFlow>
<responseFlow>
<handler type="log"/>
</responseFlow>
</globalConfiguration>

<transport
name="http"
pivot="java:org.apache.axis.transport.http.HTTPSender"/>

</deployment>

2009년 3월 5일 목요일

JSP: About Resin.conf

Resin.conf는 크게 아래와 같은 구조를 갖는다.
일반적으로 resin.conf의 Depth는 아래의 예를 따른다.

<caucho.com>
<http-server>
<host id=''>
<web-app id='/'>
<servlet-mapping url-pattern='/test' .../>
</web-app>
</host>
</http-server>
</caucho.com>

대부분의 중요한 설정은 web-app에 속해 있다.
Server는 다수의 host element를 포함하며 각 host 는 다수의 web-app 들을 포함할 수 있다.
각 host 는 가상host를 설정하고 각 web-app 는 application을 설정한다.

<caucho.com>
<http-server>
<host id='gryffindor.caucho.com' app-dir='gryffindor'>
<web-app id='/'>
<servlet-mapping .../>
...
</web-app>

<web-app id='/test' app-dir='/usr/local/test'>
...
</web-app>
</host>

<host id='slytherin.caucho.com' app-dir='slytherin'>
...
</host>

...
</http-server>
</caucho.com>

Simple configurations host 와web-app tag의 생략을 허용한다. 만약 host 와 web-app를
생략한다면 default host 와 default application를 사용하게 되며 http-server element 의 모든 web-app에 동일한 설정을 적용하게 된다.

<caucho.com>
<http-server app-dir='/usr/local/web'>
<servlet-mapping .../>
...
</http-server>
</caucho.com>

1. <caucho.com>의 하위 엘리먼트

<log id='/log' href='stderr:' timestamp='[%Y-%m-%d %H:%M:%S.%s]'/>
로깅을 위한 설정부분이며 id별로 각기 다른 로그를 지정할 수 있다.
rollover-count : 몇번의 로그변경을 보관할지 설정
rollover-period : 로그변경 주기 설정
ex> rollover-period=’1d’라고 설정하면 stderr.log.20050301의 형태로 매일 로그가 쌓이게 된다

<security-provider id='com.sun.net.ssl.internal.ssl.Provider'/>
JSSE(Java Secure Socket Extension)를 사용하기 위한 security-provider설정 부분으로 Caucho에서는 설정의 어려움과 성능 저하를 이유로 OpenSSL이나 SSL for Apache/IIS를 사용할 것을 권고하고 있으므로 특별한 경우가 아니면 사용하지 않는 것이 좋다.

<java compiler="internal" compiler-args=""/>
Compiler옵션으로 internal이 default이며 javac나 jikes등의 외부 컴파일러를 지정할 수 있다.

<resource-ref>
<res-ref-name>jdbc/test</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<init-param driver-name="com.caucho.jdbc.mysql.Driver"/>
<init-param url="jdbc:mysql_caucho://localhost:3306/test"/>
<init-param user=""/><init-param password=""/>
<init-param max-connections="20"/>
<init-param max-idle-time="30"/>
</resource-ref>
JNDI를 사용한 resin connection pool을 사용할 경우 설정이며 res-ref-name 은 pool name을 의미하며 그 외의 설정은 tag와 property를 참조한다.

<jsp precompile='true' static-encoding='true' recompile-on-error='true'/>
jsp페이지를 precompile하도록 지정하여 다음 접속시 바로 이용할 수 있도록 한다.
Recompile-on-error를 지정하여 jsp페이지를 compile시 java.lang.error가 발생하면 자동으로 recompile되도록 한다. Shift-JIS와 같은 인코딩을 이용해서 writing하고 UTF-8으로 printing하려면 static-encoding을 비활성시킨다.


2. <http-server>의 하위 엘리먼트

<doc-dir>doc</doc-dir>
Server의 root file이 위치한 디렉토리를 지정한다.
Apache : /usr/local/apache/htdocs, IIS : d:\inetpub\wwwroot로 변경하여 사용할 수 있다.

<http port='8080'/>
Resin을 Standalone으로 구동할 경우 사용할 http port를 지정한다.

<srun host='127.0.0.1' port='6802'/>
Load balancing을 위해 Apache나 IIS에 plugin으로 Resin을 사용할 경우의 srun port를 지정한다.

<http port=8443>
<ssl>true</ssl>
<key-store-type>pkcs12</key-store-type>
<key-store-file>keys/server_cert.p12</key-store-file>
<key-store-password>changeit</key-store-password>
</http>
SSL을 사용하는 경우 위와 같은 설정을 하며 아래의 내용을 포함한다.
key-store-type : key store의 종류(ex:비밀키, 공개키 방식)
key-store-file : key store 파일의 위치
key-strore-password : key store파일 access password

<user-name>resin</user-name>
<group-name>resin</group-name>
만약 Unix에서 bin/httpd.sh을 root로 구동할 경우 web server user를 위해 특정 Group name과 User name을 제공해야 한다. RedHat 9.0이후 Linux에서는 bin/resin을 사용해야 한다.

<class-update-interval>2s</class-update-interval>
사용자에 의해 class파일이 update됬는지 여부를 검사하는 주기이다. 이 주기에 따라 resin이 검사하므로 해당 주기를 줄이면 변경즉시 반영되므로 개발시 유용하나 서버에 부하가 가중되므로 운영시는 낮춰주는 것이 좋다.

<servlet-classloader-hack>false</servlet-classloader-hack>
True로 설정하면 Servlet spec 에 따른 classloader를 사용하고 false이면 JDK spec에 따른 classloader를 사용한다.

<error-page exception='connection' location='/my-error-page.html'/>Apache나 IIS를 이용할 시에 srun connection 실패시 표시할 error 페이지를 지정한다.

<caucho-status>true</caucho-status>
Caucho-status를 표시한다.

<thread-max>150</thread-max>
서버당 최대 thread갯수

<thread-keepalive id='100'/>
Keepalive할 trhead수.

<request-timeout id='65s'/>
Socket keepalive 시간. SSL을 사용하지 않는다면 짧게 하는 것이 성능에 좋다.

<accept-buffer-size id='256'/>
Accept buffer상의 socket 수

<thread-min id='5'/>
Socket에서 대기될 때 요청되는 최대 thread 수

<ping sleep-time='1m' retry-count='3' retry-time='1s'>
<url>http://localhost:8080/ping/ping.jsp</url>
</ping>
web server 상태를 확인하기 위해 ping test를 하기 위한 설정이다.
test결과 failuer가 발생하면 resin은 서버를 restart한다.
해당 test를 위한 thread가 JDK와 같기 때문에 해당 Thread의 deadlocks이나 Database connection 증가로 인한 memory leak같은 경우는 catch할 수 없다.

<ignore-client-disconnect>true</ignore-client-disconnect>
Browser를 disconnect할 때 발생하는 ClientDisconnectionExceptions을 무시한다

<cache dir='cache' size='1024' entries='8192'/>
internal caching을 가능하게 한다.
Dir : cache가 적재될 directory
size : memory size(kb)
entries : entry의 전체 개수

<cache-mapping url-pattern='/' expires='2s'/>
Cache된 파일의 유효시간 일반적으로 운영중에는 15m으로 설정한다.

<servlet-mapping url-pattern='*.xtp' servlet-name='xtp'/>
<servlet-mapping url-pattern='*.jsp' servlet-name='jsp'/>
<host>외부의 servlet 설정이다. 이곳에 위치하면 모든 host에 적용된다.

<servlet-mapping url-pattern='/servlet/*' servlet-name='invoker'/>
URL로부터 servlet명으로 invoke한다. 예를 들어 /examples/basic/servlet/HelloServlet 은 HelloServlet class로부터 시작한다. 일반적으로, 보안상 헛점이 생길 수 있으므로 개발중에만 사용하며 운영중에는 사용하지 않는다.

<welcome-file-list>index.xtp, index.jsp, index.html</welcome-file-list>
시작페이지를 지정한다.


3. <host>의 하위 엘리먼트

<access-log id='logs/access.log'
format='%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"'
rollover-period='1W'/>
<error-log id='logs/error.log'/>
Resin 단독구동 시 로깅을 위한 내용이다.

<war-dir id='webapps'/>
Specifies a special directory to place war file이 위치한 특정 directory를 지정한다.
War directory에 위치한 어떤 .war (web-application resource) file이던지 자동으로 확장/설치 된다. 일반적으로, war file은 설정을 위해 WEB-INF/web.xml 을 사용하며 구문은 다른 application 설정과 동일하다.


4. <web-app>의 하위 엘리먼트

<classpath id='WEB-INF/classes'
source='WEB-INF/classes'
compile='true'/>
classpath를 지정한다. Source는 option이다. Servlets 과 beans는 일반적으로 WEB-INF/classes에 위치한다.

<session-config>
<session-max>4096</session-max>
<session-timeout>30</session-timeout>
<enable-cookies>true</enable-cookies>
<enable-url-rewriting>true</enable-url-rewriting>
<file-store>WEB-INF/sessions</file-store>
</session-config>
세션에 관한 설정이다.
Session-max : 최대 session 개수
Session-timeout : session timeout 시간(초)
Enable-cokkies : 쿠키 사용여부
Enable-url-rewritin :
세션을 아래의 방법중 하나를 사용하여 외부에 적재할 경우 개발 중 class 변경으로 인한 세션 삭제를 방지할 수 있다.
File-store : 세션을 지정된 디렉토리에 적재한다.
tcp-store : tcp-ring을 사용하여 세션을 적재한다.
Jdbc-store : DB table을 사용하여 세션을 적재한다.

<multipart-form upload-max='-1'/>
multipart-mime/form 사용을 가능하게 한다.

<path-mapping url-regexp='^/~([^/]*)' real-path='/home/$1/public_html/'/>
url path를 실제 path에 mapping한다.

<context-param info='An application information string'/>
Application init parameter이다.

<servlet-mapping url-pattern='/snoop/*' servlet-name='snoop-servlet'/>
모든 url에서 /snoop에 대하여 snoop-servlet 이름으로 접근한다.

<servlet servlet-name='snoop-servlet' servlet-class='Env'>
<init-param info='A servlet information string'/>
</servlet>
snoop-servlet init parameter로 info='A servlet information string'를 사용하여 구동한다.

2009년 2월 16일 월요일

2009년 2월 11일 수요일

jsp: request.header

HTTP 환경변수의 HTTP_REFERER를 이용해봅시다'ㅂ'

(import javax.servlet.http.HttpServletRequest;)





각 언어별로 HTTP_REFERER를 확인하는 방법은 아래와 같습니다. 리턴값은 스트링이구요.


ASP => Request.ServerVariables("HTTP_REFERER")
PHP => $_SERVER['HTTP_REFERER']
JSP => request.getHeader("REFERER")



HTTP_REFERER의 값의 유무와 각 웹서버의 로그파일을 이용해서
어떻게 방문했는지를 추출할 수 있습니다.


1. 주소창에 주소를 입력해서 들어오는 경우
- HTTP_REFERER의 값이 없음

ex)strReferPath = Trim(Request.Servervariables("HTTP_REFERER"))

strReferPath == null ? 1 : 0 -> 1이 반환 되겠져


2. '즐겨찾기'를 이용해서 들어오는 경우(IE의 경우)
- HTTP_REFERER의 값이 없음
- 로그파일에 ..../favicon.ico로그가 먼저 남는다.
- 이는 IE가 즐겨찾기를 눌러서 사이트를 방문할 경우 favicon.ico 요청을 하고, 해당 URL의 요청을 하기때문입니다.


3. 링크를 통해서 들어오는 경우.(쉽게 말해서 a태그를 통해)
- HTTP_REFERER에 이전 URL정보가 들어있음.


이렇게 3가지 패턴으로 어느정도 확인을 할 수가 있습니다만-!

자바스크립트로 location.href를 통해 설정된 주소로 들어왔을경우

이전의 주소를 알아 낼 수 없다는 거겠죠; 그 밖에도 여러가지가 있겠지만...

2009년 2월 5일 목요일

JAVA: JDom with Xpaht

http://javaboutique.internet.com/tutorials/jdom&/article.html

세상엔 참 착한 이들이 많은것 같다.

2009년 2월 4일 수요일

ORACLE : 특수문자 검색

오라클에서 특정 문자들은 특정한 기능을 수행하도록 예약되어 있다.
예를들면 Wild 문자열
_ (underscore): 문자 하나
% (percentage): 포함하는
' (apostrophe): 문자열의 시작과 끝

이러한 특수 문자들은 오라클이 쿼리를 해석할때 글자 그대로 해석하지 않기 때문에 쿼리를 만들때 반드시 이를 고려해야 한다.

예를들면 데이타베이스 테이블 "mytable"에 다음과 같이 데이타가 들어 있는 경우
ID, NAME
-------------
100, ABC
101, ABC%1
102, ABC%2
103, ABCD1
104, ABCD2


ID 101 ABC% 를 구하기 위하여 포함된 질의 결과를 얻으려고 할 때

SELECT * FROM mytable WHERE name like 'ABC%%' 을 수행하면 ABC로 시작하는 모든 레코드가 리턴된다.

이 경우 ABC%로 시작하는 레코드를 구하기 위하여는 아래와 같이

SELECT * FROM mytable WHERE name like 'ABC!%%' ESCAPE '!' 처럼 Escape 문자열이 어떤 것인지 명시적으로 알려 줘야 한다.

다시 말하면 ESCAPE 라는 키워드를 통해서 오라클로 하여금 특정 스페셜 문자를 글자 그대로 해석하도록 지정 할 수 있다.

Ex)
SELECT t.*, a.admincode
FROM usrgrp_type t, usrgrp_admincodes a
WHERE a.usrgrpid = t.usrgrpid
AND a.admincode like 'A!%%' ESCAPE '!'
ORDER BY a.admincode, a.usrgrpid

select * from em_account_his where resulttxt like '%!%%' ESCAPE '!'

2009년 1월 13일 화요일

JDBC: config oracle resource

기본적으로 SID 와 SERVICE NAME의 차이부터 이해하도록 한다.
* SERVIE NAME은 데이터 베이스의 군 (미러링을 하던지.. 등등)
* SID는 각각의 디비 인스턴스

설정도 위에 따라 바뀐다.
각각의 호스트 스트링은 다음과 같다.

IF SID
"jdbc:oracle:thin:@host:port:sid"

IF SERVICE NAME
"jdbc:oracle:thin:@//host:port/service name"

2009년 1월 4일 일요일

JAVA: find class location

클래스명.class.getResource("클래스명.class").getPath();