regedit /e e:\\PuTTY.reg HKEY_CURRENT_USER\Software\SimonTatham
레지스트리 파일을 export해서 사용.
2008년 12월 30일 화요일
tip: putty export
2008년 12월 29일 월요일
JSP: blank first line (when to print XML) solution
파싱중에
The XML declaration may only appear at the very beginning of the document.
이런 메시지를 만나게 되었다. 공백이 있거나 잘못된 xml선언이 첫줄에 오지 않을 경우 만나게 되는 오류인데 jsp에서 xml을 단순히 output하는 코드이기에 문제점이 없을 줄 안게 오산.
<%@ page contentType="text/xml; charset=euc-kr" %><%@ page import=...%><%
위처럼 선언부를 붙여서 쓰지 않아서 첫줄이 공백이... 생겼던 것이었다.
왜 붙여야만 되는 지 정확한 이유는 모르겠지만...
2008년 12월 11일 목요일
MySQL : 게정 관리
MySQL을 처음 설치하면 root 암호가 설정되어 있지 않기 때문에 반드시 설치 후 바로 root 암호를 먼저 설정해주세요.%%% root 암호를 설정하기 위해서는 $ mysqladmin -u root -p password new-password
이러한 명령을 실행하면 됩니다. 실행하면 패스워드를 입력하라고 하는데 처음 root의 패스워드는 없으므로 그냥 엔터를 치시면 root 패스워드가 변경됩니다.
update문을 이용하여 root 암호 설정 $ mysql -u root mysql
mysql> update user set password = password('new-password') where user = 'root';
mysql> flush privileges;
set password를 이용하여 root 암호 설정 mysql> set password for root = password('new-password');
마지막으로 패스워드가 재대로 변경되었는지 테스트를 합니다. $ mysql -u root -p
ORACLE : 유일한 값 얻기
MSSQL 에 NEWID() 라는 함수가 있다. 이와 비슷한 함수가 오라클에는 SYS_GUID 함수이다.
데이터베이스 레코드는 각 레코드별로 무결성을 유지 해야한다. 즉 서로다른 레코드가 같은 값을 가지면 않된다. 테이블의 어느 한 필드 값은 반드시 달라야 한다. 어떤경우 이러한 상태를 유지하기가 어려울 때가 종종 있다. 이런경우 테이블의 한 필드를 반드시 서로 다른 값을 넣어야 한다.
우리가 다른 레코드와 다른 값을 갖도록 유지 하려면 다른 레코드들을 모두 검색해 보아야 할 것이다. 그러나 레코드 수가 많아지면 속도의 유지를 보장할 수 없다. 그러므로,, 항상 어느상황에서든 난수적으로 다른 값이 나오도록 하는 함수가 필요하다. 이런경우 SYS_GUID함수를 사용한다.
SYS_GUID함수의 리턴값은 반드시 호출할때마다 다른 값의 문자열을 출력하도록 설계 되어 있다.
2008년 12월 10일 수요일
2008년 12월 9일 화요일
LINUX: Mysql Install Command History
cat /proc/cpuinfo
cat /etc/redhat-release
down MySQL-server-community-5.0.67-0.rhel3.i386
down MySQL-clinet-community-5.0.67-0.rhel3.i386
rpm -Uvh MySQL-server-community-5.0.67-0.rhel3.i386
rpm -Uvh MySQL-client-community-5.0.67-0.rhel3.i386
/etc/rc.d/init.d/mysqld start
hostname
rpm -qi mysql
rpm -evv mysql
rpm -qa grep mysql
rpm -e --nodeps mysql-bench-3.23.58-16.RHEL3.1
cp /usr/share/my_huge.cnf /etc/my.cnf
vi my.cnf
JAVA : DEVELOPER TOOLS
개발 도구
Eclipse : http://www.eclipse.org/
Netbean : http://www.netbeans.org/community/releases/60/index.html
Firebug : http://www.getfirebug.com/
소스코드 관리
CVS : http://www.cvshome.org
Subversion : http://subversion.tigris.org
MS Visual SourceSafe
BitKeeper : http://www.bitkeeper.com
ClearCase : http://www-306.ibm.com/software/awdtools/clearcase/
빌드 스크립트 도구
make : http://source.redhat.com/cygwin
Automake : http://www.gnu.org/software/automake
Ant : http://ant.apache.org
NAnt : http://nant.sourceforge.net
Groovy : http://groovy.codehaus.org
Rake : http://rake.rubyforge.org/
SCons : http://www.scons.org/
빌드 시스템
Maven : http://maven.apache.org
Maven2 : http://maven.apache.org/maven2/index.html
CI 도구
CruiseControl : http://cruisecontrol.sourceforge.net
CruiseControl .NET : http://sourceforge.net/projects/ccnet
DamageControl : http://damagecontrol.codehaus.org
AntHill : http://www.urbancode.com/projects/anthill
Continuum : http://maven.apache.org/continuum
LuntBuild : http://luntbuild.javaforge.com/
Buildix : http://buildix.thoughtworks.com/
Hudson : https://hudson.dev.java.net/
이슈 추적 도구
Bugzilla : http://www.bugzilla.org
JIRA : http://www.atlassian.com/software/jira/default.jsp
FogBugz : http://www.fogcreek.com/FogBugz
PR-Tracker : http://www.prtracker.com
Trac : http://trac.edgewall.org/
테스트 프레임워크
JUnit : http://www.junit.org
NUnit : http://www.nunit.org
xUnit.NET : http://www.codeplex.com/xunit
MbUnit : http://www.mbunit.org
HTMLUnit : http://htmlunit.sourceforge.net
HTTPUnit : http://httpunit.sourceforge.net
JWebUnit : http://jwebunit.sourceforge.net
Cobertura : http://cobertura.sourceforge.net
Clover : http://www.cenqua.com/clover
Cactus : http://jakarta.apache.org/cactus/
Emma : http://emma.sourceforge.net/
Fit : http://fit.c2.com
Fitness : http://fitnesse.org
Watir : http://wtr.rubyforge.org
Systir : http://atomicobject.com/systir.page
AUT : http://aut.tigris.org/
UnitTest++ : http://unittest-cpp.sourceforge.net/
TestNG : http://testng.org/doc/
CppUnit : http://sourceforge.net/projects/cppunit
CppUnit2 : http://cppunit.sourceforge.net/cppunit-wiki/CppUnit2
Selenium : http://www.openqa.org/
Agitar : http://www.agitar.com/
JTest : http://www.parasoft.com/jsp/home.jsp
PushToSoft : http://www.pushtotest.com/
Eclemma : http://www.eclemma.org/
프로젝트 관리
OpenProj : http://openproj.org/openproj
dotproject : http://www.dotproject.net/
Mantis : http://www.mantisbt.org/
커뮤니케이션 도구, 위키
MoinMoin : http://moinmoin.wikiwikiweb.de/
Confluence : http://www.atlassian.com/software/confluence/
TWiki : http://twiki.org/
SocialText : http://www.socialtext.com/
Springnote : http://www.springnote.com/ko
성능분석
ANTS Load : http://www.red-gate.com/products/ants_load/index.htm
JunitPerf : http://www.clarkware.com/software/JUnitPerf.html
Jmeter : http://jakarta.apache.org/jmeter/
기타
Structure101 : http://www.headwaysoftware.com/index.php
FreeMind : http://freemind.sourceforge.net/wiki/index.php/Main_Page
Capistrano : http://manuals.rubyonrails.com/read/book/17
출처 : http://moai.tistory.com/270
2008년 11월 28일 금요일
VS : 단축키
VS.NET 단축키
1.F12 : 함수 정의된 모듈로 이동
2.ctrl+shift+spacebar : 메소드 매개인자 보기
3.F9 중단점 지정.
4.F5 디버깅 모드로 실행.(이미 디버깅 모드로 실행중일때 F5를 누르면 다음 중단점까지 이동) 5.Ctrl+F5 디버깅하지 않고 실행.
6.F10 프로시저단위실행.(현재 행이 메소드 호출일 경우 메소드 전체를 실행하고 호출한 메소드의 다음 행으로 이동한다.)
7.F11 한 단계 실행.(현재 행이 메소드 호출일 경우 메소드 안에 있는 코드의 첫째 행으로 이동한다.)
8.Shift+F11 프로시저 나가기.
9.Ctrl+Shift+F9 모든 중단점 제거.
10.ctrl+shift+F5 : 디버깅 중일때 다시 시작.
11.ctrl+shift+B : 솔루션 빌드.
12.ctrl + F4 : 현재 문서 닫기 (열린 페이지가 너무 많아 버벅일 땐..닫아주어야 한다고 하네요..최소한의 작업 파일만 열어둘 것.)
13.ctrl + Tab : 내부 문서간 이동
<뷰어>
13.솔루션 탐색기 : Ctrl + Alt + L
14.클래스 탐색기 : Ctrl + Shift + C
15.속성창 : F4
16.출력창(빌드결과) : Ctrl + Alt + O (알파벳 오)
17.도구상자 : Ctrl + Alt + X
18.작업목록 창보기 : Ctrl + Alt + K
19.(aspx, ascx) 디자인 화면 : Shift + F7
20.(aspx, ascx) cs 소스 화면 : F7
21.(aspx, ascx) 디자인 Html 소스 :Ctrl + PageDown -> 위화면은 (aspx, ascx) 디자인 화면일때 가능 22.화면을 넓게쓰기(소스를 넓게보기): Alt + Shift + Enter -> 원래화면도 같음. => 위 3개창 어느것이나 창을 닫을려면 마우스 포커스가 있는 상태에서 Shift + ESC 를 누르면 됩니다.
<소그 편집 및 코딩시 >
23. 한 소스 안에서의 북마크 북마크 찍기(해제) : Ctrl + K K 북마크로 이동 : Ctrl + K N 북마크 전체 해제 : Ctrl + K L
24. 여러 소스에서의 북마크 북마크 찍기 : Ctrl + K H 북마크 찍은 목록보기 : 1. Ctrl + Alt + K 누르면 작업목록 창이 나온다. 2. 오른쪽 Ctrl 왼쪽에 있는 목록보기 버튼 클릭하면 리스트가 나온다. 3. 이상태에서 K 누르고 S 누른다. (동시에 누르는거 아님) 4. 그럼 바로가기 목록이 나오고 이목록이 북마크 목록이다. 5. 방향키로 원하는 소스를 선택하면 해당소스 파일로 이동하고 그 위치에 커서가 간다.
25. 한줄 주석 : Ctrl + K C
26. 주석 해제 : Ctrl + K U
27. 여러줄 주석 : 쉬프트 누르고 방향키로 선택하고 Ctrl + K C
28. 여러줄 주석 해제: 쉬프트 누르고 방향키로 선택하고 Ctrl + K U
29. 소스 정사각형으로 선택하기: Alt + Shift + 방향키
<빌드 & 디버깅>
30. 빌드 : Ctrl + Shift + B
31. 디버깅 중단점 찍기 : Ctrl + F9
32. 디버깅 중단점 모두해제 : Ctrl + Shift + F9
33. 디버깅 중단점 모두 해제: Ctrl + Shift + B
34. 디버깅 : F5
35. 디버깅 중단 : Shift + F5
36. 디버깅 중에 다시 디버깅 : Ctrl + Shift + F5
37. 디버깅 중에 한칸씩 이동 : F11
38. 디버깅 중에 함수단위이동: F10
2008년 10월 20일 월요일
JSP: html tag strip
tartgetString.replaceAll("\\<.*?\\>", "")
그냥 정규식으로 처리해버렸다. 100% 신뢰 할수 없는 방법이지만....
2008년 10월 12일 일요일
HTML: scroll css
<style type="text/css">
div.contxt {
scrollbar-3dlight-color:white;
scrollbar-arrow-color:gray;
scrollbar-base-color:black;
scrollbar-darkshadow-color:black;
scrollbar-face-color:black;
scrollbar-highlight-color:white;
scrollbar-shadow-color:white;
}
</style>
2008년 10월 1일 수요일
JAVA: NAVER OPEN MAP & HTTP CLIENT
적당히 아래와 같이 쓸 수도 있겠다.
JSP 페이지도 적당히 만들어서 적당히 IMPORT하여 쓰는 방법이 오히려 더 편할 것 같기도 하지만..
뭐.. 적당히 적당히...
<%
String adress = request.getParameter("adress");
adress = URLDecoder.decode(adress, "utf-8");
HttpClient client = new HttpClient();
PostMethod httppost = new PostMethod("http://maps.naver.com/api/geocode.php");
//한글 처리를 위한 헤더 셋팅
httppost.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded; charset=euc_kr");
DefaultMethodRetryHandler retryhandler = new DefaultMethodRetryHandler();
retryhandler.setRequestSentRetryEnabled(false);
// retry 시도 실패 했을때..
retryhandler.setRetryCount(3);
httppost.setMethodRetryHandler(retryhandler);
httppost.addParameter("key", "naver api key");
httppost.addParameter("query",adress);
try {
client.executeMethod(httppost);
if (httppost.getStatusCode() == HttpStatus.SC_OK) {
String bodyString = httppost.getResponseBodyAsString();
//System.out.println(httppost.getResponseBodyAsString());
XStream xStream = new XStream(new DomDriver());
xStream.alias("geocode",GeoCode.class);
xStream.alias("item",Item.class);
xStream.addImplicitCollection(GeoCode.class, "items");
GeoCode geoCode = (GeoCode)xStream.fromXML(bodyString);
String result = ((Item)geoCode.getItems().get(0)).getPoint().toJson();
out.print(result);
System.out.print("result : " + result);
} else {
System.out.println("Unexpected failure: "
+ httppost.getStatusLine().toString());
}
} finally {
httppost.releaseConnection();
}
%>
2008년 9월 26일 금요일
JAVA: USE ORALCE CLOB
아래 4월달에 쓴 글도 있지만 삽질의 흔적으로 삼고자 글을 새로 쓴다.
/**
* oracle의 CLOB을 이용하여 java의 Clob을 생성한다.
*
* @param clobValue
* @param conn
* @return
* @throws Exception
*/
public static Clob getClob(String clobValue, Connection conn) throws Exception{
Clob newClob= null;
if(clobValue!=null) {
try{
if (conn.getClass() == UserConnectionAdapter.class) { //env: resin pool connection
newClob = oracle.sql.CLOB.createTemporary(
((UserConnectionAdapter)conn).getConnection() ,
true, oracle.sql.CLOB.DURATION_SESSION);
} else if (conn.getClass() == OracleConnection.class) { //env: oracle connection
newClob = oracle.sql.CLOB.createTemporary(
conn,
true, oracle.sql.CLOB.DURATION_SESSION);
} else if (conn.getClass() == Connection4Oracle.class) { //env: jennifer connection
conn = ((Connection4Oracle)conn).getNativeConnection();
newClob = oracle.sql.CLOB.createTemporary(
((UserConnectionAdapter)conn).getConnection(),
true, oracle.sql.CLOB.DURATION_SESSION);
} else { //env: else connection
newClob = oracle.sql.CLOB.createTemporary(
conn,
true, oracle.sql.CLOB.DURATION_SESSION);
}
if(newClob!=null) {
((oracle.sql.CLOB)newClob).putString(1, clobValue);
}
} catch (Exception e){
e.printStackTrace();
}
}
return newClob;
}
위의 메소드를 이용해서
psmt.setClob(psmtIndex++, DaoHelper.getClob( info.getEtcInfo(), conn ));
dao 단의 코딩이 좀더 깔끔하게 되었다.
좀더 정리 할 필요가 있지만 그건 조금 나중이 될 듯 하다.
2008년 9월 24일 수요일
JAVASCRIPT: RADIO 값 가져 오기 (WITH PROTOTYPE)
http://xavisys.com/2007/03/using-prototype-javascript-to-get-the-value-of-a-radio-group/
prototype을 써도 radio 값을 가져올때는 좀 껄끄럽다.(버젼업에서는 해결되길 바라며..)
위의 링크를 참조하자.
function $RF(el, radioGroup) {
if($(el).type && $(el).type.toLowerCase() == 'radio') {
var radioGroup = $(el).name;
var el = $(el).form;
} else if ($(el).tagName.toLowerCase() != 'form') {
return false;
}
var checked = $(el).getInputs('radio', radioGroup).find(
function(re) {return re.checked;}
);
return (checked) ? $F(checked) : null;
}
이 function으로 간단하게 가져 올 수 있다.
var value = $RF('radio_btn_id');
var value = $RF('form_id', 'radio_grp_name');
이정도는 직접 짜버릇 해야 되는데.. 이넘의 ctrl+C + ctrl+V의 습관은 좀처럼 고쳐질 줄을 모른다.
2008년 9월 22일 월요일
JAVA: property 사용시 tip
프로퍼터 사용시 동일 경로 상에서 적당히 properties파일을 사용 하고 싶을때는
InputStream is = getClass().getResourceAsStream("message.properties");
이렇게 불러올 수도 있다.
2008년 8월 25일 월요일
JAVA: XML ENGINE - XSTREAM
2008년 8월 12일 화요일
2008년 8월 1일 금요일
2008년 7월 29일 화요일
2008년 7월 20일 일요일
Javascript: IE blink
function doBlink() {
var blink = document.all.tags("BLINK");
for (var i=0; i < blink.length; i++) {
blink[i].style.visibility = (blink[i].style.visibility =="visible") ? "hidden":"visible";
}
}
if (document.all) setInterval("doBlink()",500);
2008년 7월 16일 수요일
JAVA: RESIN & JSTL
http://www.i-fam.net/water/56
RESIN에서 JSTL 버그는 3.X대에서도 고쳐 지진 않은 것 같다.
대부분 fast-jstl 이라는 것 때문에 일어 나는 경우가 많은 것 같다.
2008년 7월 12일 토요일
2008년 7월 3일 목요일
HTML: CSS 로 onfocus=this.blur() 설정
a { selector-dummy : expression(this.hideFocus=true); }
이렇게 하면 매번 onfocus=this.blur() 로 포커싱을 없에 주지 않아도 된다.
AJAX : PROTOTYPE 에서 EVENT 사용
프로토 타잎 API참고 블로그
http://theeye.pe.kr/211
대부분의 내용이 prototype api의 내용이긴 하지만 번역되어 있다.
2008년 6월 27일 금요일
AJAX: TIP & DOC
Ajax와 XML: 테이블을 위한 Ajax(한글)
http://www.ibm.com/developerworks/kr/library/x-ajaxxml10/#list2
쓸만한 effect들 ( prototype과 mootools는 같이 사용할 수 없어서 아쉽다.)
http://moofx.mad4milk.net/
json lib
http://json-lib.sourceforge.net/
json from XML
http://www.terracoder.com/
XML & java
http://xstream.codehaus.org/
http://gyumee.egloos.com/1291803
(한글)
2008년 6월 26일 목요일
2008년 6월 19일 목요일
SECURITY: SSL 인증
http://blog.empas.com/skc101/read.html?a=22241538
EX7에선 꽤 귀찮은 작업이 되었다. 이중 ifram관련된 부분은
EX6에선 보안경고가 뜨지만 EX7에서는 보안경가 뜨지 않는 다는 점은 조금 다르다.
2008년 6월 9일 월요일
JAVA: GWT
gwt download
http://code.google.com/webtoolkit/download.html
eclipse plug in
http://www.instantiations.com/gwtdesigner/index.html
tutorial
http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Google/Service/GoogleWebToolkit/StartedGuide
한글 처리가 좀 귀찮다.
KitchenSink 예제의 경우 가장 간단한 처리 방법은 java파일을 utf-8로 저장한다.
또는
1. KitchenSink.gwt.xml 수정
<module>
...
<extend-property name="locale" values="EUC_KR">
...
</module>
2. 출력하는 페이지인 KitchenSink.html 수정
<head>
...
<meta http-equiv="Content-Type" content="text/html; charset=EUC_KR">
...
</head>
아니면
property를 이용하는 방법등이 있겠다.
2008년 6월 5일 목요일
JAVA: Limit of primitive type
--------------------------------------------------------------------------------------
종류 설명 저장 공간 값의 범위 (최소값~최대값)
======================================================================================
boolean 논리값 1 bit true / false
--------------------------------------------------------------------------------------
byte 부호 있는 정수 8 bits -128 ~ 127
--------------------------------------------------------------------------------------
char 유니코드 문자 16 bits \u0000 ~ \uFFFF
--------------------------------------------------------------------------------------
short 부호 있는 정수 16 bits -32768 ~ 32767
--------------------------------------------------------------------------------------
int 부호 있는 정수 32 bits -2147483648 ~ 2147483647
--------------------------------------------------------------------------------------
long 부호 있는 정수 64 bits -9223372036854775808 ~ 9223372036854775807
--------------------------------------------------------------------------------------
float IEEE 754 실수 32 bits 1.40239846E-45f
~ (표현 가능 양수 범위)
3.40282347E+38f
--------------------------------------------------------------------------------------
double IEEE 754 실수 64 bits 4.94065645841246544E-324
~ (표현 가능 양수 범위)
1.79769313486231570E+308
--------------------------------------------------------------------------------------
2008년 6월 3일 화요일
2008년 6월 2일 월요일
ECLIPSE: memory error
-showsplashorg.eclipse.platform--launcher.XXMaxPermSize256M-vmargs-Dosgi.requiredJavaVersion=1.5-Xms40m-Xmx512m이때 --launcher.XXMaxPermSize256M이 부분이 문제를 일으켰다. 윗 구문과 아래 구문사이에 공백이 하나도 없어 발생하는듯 하다. 256M부분앞에 공백 하나만 넣어주면 해결된다.
또한 perzamspace도 웬만하면 512로 올려 주는 것이 좋다.
그리고 현제까지도(3.4 가니메데가 나온 지금에도) sun vm을 제대로 인식하지 못하는 버그가 있다. ini 파일에 -vm 옵션으로 javaw를 직접 지정해 주면 해결 된다.
eclipse.ini 내용을 보면
org.eclipse.platform
--launcher.XXMaxPermSize
128M
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms128m
-Xmx512m
요런 내용이 있습니다..
자.. 보면
XXMaxPermSize : class 정보를 담고 있는 공간.
Xms128m : 초기 시작시 메모리 공간(최소 메모리 공간)
Xmx512m : 최대 메모리 공간
ps. window 같은 경우 최대 메모리 공간이 시스템의 50% 이하로 설정 해줘야 한다고 합니다.
그 이상을 했을경우 eclipse 실행이 안되고 죽는다고 합니다.
(확인은 못했습니다. 전 비스타라서.. ;; )
2008년 5월 28일 수요일
JAVAFX: START
http://java.sun.com/javafx/downloads/
http://java.sun.com/developer/technicalArticles/scripting/javafx/ria_1/#1
eclipse plugin
https://openjfx.dev.java.net/javafx-eclipse-plugin-install.html
Help > Software Updates > Find and Install.
http://download.java.net/general/openjfx/plugins/eclipse/site.xml
doc
https://openjfx.dev.java.net/JavaFX_Programming_Language.html
study
http://java.sun.com/developer/technicalArticles/scripting/javafxpart1/
http://java.sun.com/developer/technicalArticles/scripting/javafx/lc/part1/index.html
JavaFX Script 2D Graphics Tutorial
2008년 5월 25일 일요일
JAVA: JAVA REVERSE COMFILER
jad 실행
ex) jad -sjava -8 xxx.class
-sjava 결과 파일의 확장자를 .java로 바꾼다.
-8 유니코드를 안시로 바꾼다. (한글처리)
2008년 5월 20일 화요일
2008년 5월 14일 수요일
SCRIPT: motion & effect
http://jstween.blogspot.com/
var t = new Tween(object,property,easing,start,end,duration,suffixe);
이런식으로 간단하게 모션효과를 구현할 수 있다.
effect javascript
http://firejune.com/index.php?pl=832#0
이것도 괜찮아 보인다.
JavaScript Effect Libraries
http://snook.ca/archives/javascript/javascript_effe/
2008년 4월 15일 화요일
AJAX: PROTOTYPE SETSTYLE()
Prototype Framework에서는 Element에 css가 아닌 자바스크립트로 스타일을 적용할 수 있게 하는 setStyle()이라는 메서드를 제공하고 있다. 물론 Element.style.display 같은 식으로 스타일에 접근하거나 할 수 있지만 setStyle()의 좋은 점은 css에서 적용하는 것처럼 스타일을 한꺼번에 적용할 수 있다.
Element의 Selector는 당연히 이것저것 있지만 가장 기본적인 getElementById를 가지고 설명하자.
(Language : javascript)
$("elementID").setStyle({
'position': 'relative',
'width': '100px',
'height': '100px',
'overflow': 'hidden',
'border': 'solid 1px #808080'
});
마치 CSS를 사용한 것처럼 익숙한 스타일로 한꺼번에 스타일을 적용할 수 있다. px를 사용할 때 100px처럼 붙혀서 쓰는 것이 좋다. px앞에 공백이 있으면 브라우저에 따라 안 먹을 수 있다.
스타일 프로퍼티쪽은 꼭 홑따옴표(')로 묶어주지 않아도 상관없기는 하지만 float처럼 reserved word와 겹치는 경우에는 문제가 생길 수 있기 때문에 이런 충돌은 홑따옴표로 묶어서 해결할 수 있다.
근데 setStyle()을 사용할 때 주의할 점은 -가 붙는 CSS 프로퍼티에 대한 부분이다.
CSS에서도 내부 스타일과 외부 <style&rt;태그로 할때 프로퍼티의 이름이 다른 경우들이 좀 있는데 그것처럼 여기서도 주의해야 할 부분이 있다.
background-color 이나 font-size처럼 CSS 프로퍼티가 - 가 붙는 경우에는 backgroundColor 나 fontSize 처럼 카멜방식으로 - 가 없이 작성해 주어야 동작을 한다. 모든 - 가 붙는 프로퍼티가 다 그런지 까지는 확인하지 못했지만 위의 2가지는 확실히 - 없이 작성해 주어야 한다. 대소문자를 가리기 때문에 반드시 위와같은 카멜방식이어야 한다.
이것때문에 한참 해맸다. 처음에는 동적으로 생성한 엘리먼트에는 setStyle이 안 먹나 해서 이것저것 했었는데 결국 스타일이 적용 안된게 저 문제 때문이었다.
덧) 각 스타일은 콤마(,)를 이용해서 구분하는데 마지막에도 콤마를 붙혀주는 실수를 할 경우 Firefox에서는 잘 돌아가지만 IE에서는(내 경우는 7) 에러가 난다. 더군다나 콤마때문에 렌더링 오류가 나는데 생뚱맞은 곳에서 오류메시지가 나기 때문에 디버깅 하기도 쉽지 않다. 콤마에 주의!!
덧) (2008.3.6) CSS의 프로퍼티를 -를 쓰지 않고 대신 카멜방식처럼 대문자로 이어붙히는 것은 자바스크립트 자체의 특징으로 특정 프로퍼티에 대시(-)를 사용할 수 없게 되어있다고 한다. 프로토타입의 특징은 아니었다.
http://blog.outsider.ne.kr/114에서 인용
2008년 4월 2일 수요일
SCRIPT: EDITOR
http://www.fckeditor.net/에서 다운 받아서
사용 할 수 있다.
java에서는 조금 귀찮은 커스터 마이징이 필요하다.
http://blog.naver.com/devstory/130007533735
JAVA: USE ORACLE CLOB IN JDBC
public static Clob getClob(String clobValue, Connection conn) throws Exception{
Clob newClob= null;
if(clobValue!=null) {
try{
newClob = oracle.sql.CLOB.createTemporary(conn, true, oracle.sql.CLOB.DURATION_SESSION);
if(newClob!=null) {
((oracle.sql.CLOB)newClob).putString(1, clobValue);
}
} catch (Exception e){
}
}
return newClob;
}
입력 시에는 이런식으로 Clob타잎을 생성한후에 preparestatement의 setClob()을 사용 하면 된다.
버그가 있다고는 하는데.. 아직 경험해 보지는 못했다.
결국 경험하게 되었다. pooling된 connection에서는 작동하지 않는다.
다시 해결 방법을 찾았다. http://wiki.caucho.com/Database_FAQ67890
Will the pool be automocatically set to queue if number of connections requested
is more than max connections?
You mean block the waiting thread. Yes.
"queue" doesn't make sense in this context.
If you're using the
PooledDataSource instead of the Driver SPI, you'll get the Oracle connection
directly.
Otherwise, you need to case the Connection to
com.caucho.sql.UserConnectionAdapter and call getConnection() to get the
underlying Oracle connection.
코드는 이렇게 바뀐다.
newClob = oracle.sql.CLOB.createTemporary (((com.caucho.sql.UserConnectionAdapter)conn).getConnection() , true, oracle.sql.CLOB.DURATION_SESSION);
resin의 connection adapter에서 oracle의 connection을 반환하여 처리 한다.
그리고 조회 시에는 이런 식으로 받아 올 수가 있다. CLOB의 stringValue()라는 녀석을 쓰면 딱 좋겠지만 써보면 'java.sql.SQLException: Conversion to String failed' 에러를 내버린다.
다시 에러 발생. jennifer를 사용 할 경우 rapper class가 2중으로 되어 버려서 위의 방법으로
underlying connection을 얻을 수 없다.
http://www.caucho.com/resin-javadoc/com/caucho/sql/UserConnection.html
일단 자료 수집중.
resin 3.0 이상에서는 UserConnection 에 unwrap() method가 있어서 별 문제 없어 보이긴 하나 현제 환경은 resin 2.1이라는게 문제.
CLOB c = (CLOB)rs.getClob(1);
matchInfo.setIntro( c.getSubString(1, (int)c.length()) );
베베 꼬아서 jdbc를 개발한 오라클 놈들에게 박수를 보내며...
이게 도움이 될지는 모르겠지만...
// first, create statement to insert
OraclePreparedStatement ps;
ps = (OraclePreparedStatement )con.prepareStatement("INSERT INTO Test (text) VALUES (?)");
// create a temporary CLOB and write to it
CLOB clob = CLOB.createTemporary(con, true, CLOB.DURATION_SESSION);
Writer out = clob.getCharacterOutputStream();
out.write(myLongText);
// set the CLOB on the OraclePreparedStatement and execute
ps.setCLOB(1, clob);
ps.executeUpdate();
이것도
2008년 4월 1일 화요일
AJAX: NOTICES TO ELEMENT MOVING
function bindMatch(){
var allNodes = $("src");
for(i = allNodes.length - 1; i >= 0 ; i--) {
if (allNodes[i].selected == true){
$("target").appendChild(allNodes[i]);
}
}
}
이런식으로 element를 이동 시킬때는 밑에서 부터 이동 시켜야 한다.
참조하는 [i]의 값이 변하기 때문이다.
2008년 3월 30일 일요일
AJAX: LOADING
간단하게 LOADING을 구현 할 수 있게 도와 준다.
http://aka-fotos.de/protoload/
적당히 설치 한후에
prototype 에서
function doSearch(arg){
var url = 'xxx.xml';
var myAjax = new Ajax.Request(
url,
{
//asynchronous: false,
method: 'post',
parameters: {arg:arg},
onComplete: completeFunction,
onFailure: reportError,
onLoading: function() {
$("target").startWaiting('bigWaiting');
}
});
}
처럼 onLoading에 등록하고
$("target").stopWaiting(); 으로 적당한 (complete function 쯤)에서 닫아 주면 된다.
ps. 위치에 제대로 나오지않을 경우엔
1. 스크린 오브젝트를 appendChild하는 부분
원본
(element.offsetParent || document.body).appendChild(element._loading = e);
수정본
document.body.appendChild(element._loading = e);
2. 스크린오브젝트 위치 구하는 부분
원본
var left = this.offsetLeft,
top = this.offsetTop,
width = this.offsetWidth,
height = this.offsetHeight,
l = this._loading;
수정본
pos = Position.cumulativeOffset(this);
var left = pos[0],
top = pos[1],
width = this.offsetWidth,
height = this.offsetHeight,
l = this._loading;
처럼 수정해 주면 된다.
http://10year.tistory.com/39 에서 인용.
2008년 3월 25일 화요일
ORACLE: SHOW VIEW
USER_VIEWS에 질의 함으로 VIEW의 정보를 알아 낼 수 있다.
select TEXT from user_views where view_name= :VIEW NAME
LONG TYPE으로 저장 되어 있으니 주의.
2008년 3월 19일 수요일
ECLIPSE: ECLIPSE.INI
NO MORE 'OUT OF MEMORY'
-showsplash
org.eclipse.platform
–launcher.XXMaxPermSize
256m
-vmargs
-Xms256m
-Xmx512m
OR
eclipse -vmargs -XX:PermSize=256M -XX:MaxPermSize=512M
2008년 3월 15일 토요일
AJAX : VIEWER API (Highslide js)
Highslide js
간단하게 js 이펙트(이미지 뷰 관련)를 구현 할 수 있게 하여 준다. 개인 사용자가 아닐 경우 약 100$정도의 비용만 지불하면 누구라도 사용 가능하다.
개인 홈피 에 적용 시켜 보았는데 꽤 맘에 든다.
파일 업로드도 여의치 않아 블로그 템플릿에 url로 js와 graphics와 css를 링크해서 사용시켰다.
2008년 3월 5일 수요일
HTML : DIV TEXT CUT
<div style='line-height:1.3em; float:left; padding-top:5px; width:143px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;'>
2008년 2월 29일 금요일
JAVA : USE CALENDAR
boolean isAvailableDate(EventMainBean eventMain) throws Exception{
boolean result = false;
String pattern = "yyyyMMdd";
Calendar calendar = Calendar.getInstance();
SimpleDateFormat formatter = new SimpleDateFormat(pattern, new Locale("ko","KOREA"));
Date stDate = formatter.parse(eventMain.getDistributionStDate());
Date edDate = formatter.parse(eventMain.getDistributionEdDate());
Calendar stDateInCalendar = (Calendar)calendar.clone();
stDateInCalendar.setTime(stDate);
Calendar edDateInCalendar = (Calendar)calendar.clone();
edDateInCalendar.setTime(edDate);
edDateInCalendar.add(Calendar.DATE, 1);
if ( calendar.after(stDateInCalendar) && calendar.before(edDateInCalendar) )
result = true ;
System.out.println(calendar.after(stDateInCalendar));
System.out.println(calendar.before(edDateInCalendar));
System.out.println(result);
return result;
}
2008년 2월 27일 수요일
2008년 2월 20일 수요일
JAVA : USE DATAFORMAT
자바에서 날짜와 시간을 표시하는 방법
1. java.util package에 있는 Data나 Calendar클래스를 이용하는 방법
2. java.text package에 있는 DateFormat, SimpleDateFormat, DateFormatSymbols 클래스들을 이용
[SimpleDateFormat 클래스] 원하는 시간, 날짜표기를 쉽게 할 수 있는 방법중의 하나로 원하는 포맷을 마음대로 지정할 수 있다.
import java.io.*; public class SimpleDateFormatTest { public static void main(String args[]){ public String ko(String en) { ** 참고 **
** 일반적으로 많이 사용되는 패턴들 **
|
2008년 2월 13일 수요일
JAVA SCRIPT - DYNAMIC TABLE
function addEventPresentRow() {
var row = document.createElement("tr");
var cell = document.createElement("td");
var cell2 = document.createElement("td");
var input = document.createElement("input");
input.setAttribute("type", "text");
input.setAttribute("name", "present");
var button = document.createElement('input');
if(button.getAttribute('onclick')){ //else IE
button.setAttribute('onclick','delRow(this)');
} else{ //IE
button = document.createElement("<input onclick=\"delRow(this) \">");
}
button.setAttribute("type", "button");
button.setAttribute("value", "-");
cell.appendChild(input);
row.appendChild(cell);
cell2.appendChild(button);
row.appendChild(cell2);
document.getElementById("targetBody").appendChild(row);
}
function delEventPresentRow(buttonObj) {
var tableBody = document.getElementById("targetBody");
var index = buttonObj.parentElement.parentElement.rowIndex;
tableBody.removeChild(tableBody.childNodes[index]);
}
2008년 2월 12일 화요일
JAVA SCRIPT - setAttribute: ONCLICK
당황스럽게도 IE에선 setAttribute에서 onclick을 사용하지 못한다.
다음과 같은 방법으로 우회하자.
var button = document.createElement('input');
if(obj.getAttribute('onclick')){ //IE 외
button.setAttribute('onclick',doDel(this)');
} else{ //IE
button = document.createElement('<input onclick="doDel(this)">');
}
button.setAttribute("type", "button");
button.setAttribute("value", "delete");
2008년 2월 11일 월요일
2008년 2월 3일 일요일
ORACLE - DECODE TIP
decode 문은 일반적으로 값을 치환하는데 쓰입니다.
* 컬럼 1개를 여러개의 값으로 비교할경우..
col1 의 값이 1,2,3 인경우 각각 'ONE', 'TWO', 'THREE' 로 변환하고자 한다면,
decode(col1, 1, 'ONE', 2, 'TWO', 3, 'THREE', 'MANY')
1,2,3 이 아닌경우는 'MANY' 가 되겠죠...
* 컬럼 여러개를 한개의 값으로 비교할경우
decode(2, col1, 'col1 is TWO', col2, 'col2 is TWO', null)
* 단방향 범위를 비교하는경우
만약 25 보다 큰경우엔 25 만 리턴하고 작은경우엔 해당컬럼의 값을
리턴하고자 한다면,
decode(sign(col1-25), -1, col1, 25)
처럼 사용하면 되겠죠.
* 다차원 통계에 응용(group by 와 조합)
그룹 아이디별로 합산하는 쿼리는 일반적으로 아래와같습니다.
select grp_id, sum(score)
from GRP_SCORE_TB
group by grp_id
만약..그룹별로 총계를 내고, 그룹별 총계 합산한 총합산을 내고싶다면?
다음과같이 카티션 곱을 응용하고, decode로 선택적인 그룹핑을 해주시면
됩니다.
select MAX(decode(gubun, 1, grp_id, '총계')),
sum(score)
from GRP_SCORE_TB
cross join (select level as gubun from dual connect by level < 3)
group by gubun, decode(gubun, 1, grp_id, null)
이려면,
a001 200
a004 122
a003 27
총계 347
과 같은 결과를 낼수 있습니다.
※ 몇가지 예로 decode 의 활용을 알아보았습니다. 이외에도 order by 등에도
사용하면, 위의 group by 에 사용한것처럼, 선택적인 sorting 이 이루어지게
이용될수도 있습니다.
2008년 1월 31일 목요일
MESSENGER PROXY
회사에서 메신저를 막았다면 당황하지 말고 tor 에 가서 프록시 프로그램을 다운로드 받은 후
메신저 설정에서 연결>프록시사용체크>SOCKS4>127.0.0.1>9050로 설정한 후
로그인 하면 된다.
혹시 잘 안될 경우 tor설정의 advanced에 들어가서 포트를 확인해보자.
2008년 1월 30일 수요일
SCRIPT - AJAX : REQUEST SET EUC-KR
어디서나 골치아픈 한글 문제... XHR을 쓸때도 마찬가지다.
한글로된 인자값을 보내야 할때 처리 방법은 아래와 같다.
request.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=euc-kr");
prototype.js 에선 이렇게 된다.
var myAjax = new Ajax.Request( url,
{ method: 'post',
parameters: {groupCode:group, code:code, placeCd:placdCd},
onComplete: reportSuccess,
onFailure: reportError,
encoding: 'euc-kr',
contentType: 'application/x-www-form-urlencoded'
});
2008년 1월 27일 일요일
ORACLE - ABOUT PROCEDURES
프로시저 리스트만
select * from user_procedures;
프로시저의 내용까지
select * from user_source;
select object_name,status,TO_CHAR(CREATED,'YYYY-MM-DD HH24:mi:ss') as
CREATED,TO_CHAR(LAST_DDL_TIME,'YYYY-MM-DD HH24:mi:ss') as LAST_DDL_TIMEfrom
user_objectswhere object_type = 'PROCEDURE'
프로시저 삭제시
drop procedure
프로시저명프로시저 내용보기
select text from user_source where name = 프로시저, 함수 이름
2008년 1월 25일 금요일
SCRIPT - AJAX : PROTOTYPE WITH SAMPLE DYNAMIC CONTENTS (JSP)
level 1 --------------------------------------------------------------
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Dynamic Contents</title>
<script src="http://common.ticketlink.co.kr/ajax/prototype.js"></script>
<script type="text/javascript">
//var xmlHttp;
//function createXMLHttpRequest(){
//if ( window.ActiveXObject) {
//xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
// }
//else if (window.XMLHttpRequest){
//xmlHttp = new XMLHttpRequest();
// }
//}
//function doSearch(){
//createXMLHttpRequest();
//xmlHttp.onreadystatechange = handleStateChange;
//xmlHttp.open("GET","test.xml", true);
//xmlHttp.send(null);
//}
//function handleStateChange(){
//if(xmlHttp.readyState == 4){
//if(xmlHttp.status == 200){
//clearPreviouseResults();
//parseResults();
//}
//}
//}
//Use prototype Ajax.Request
function doSearch()
{
var url = 'test.xml';
var myAjax = new Ajax.Request(
url,
{
method: 'get',
parameters: 'null',
onComplete: parseResults,
onFailure: reportError
});
}
//alert error message when Request error
function reportError(request)
{
alert('Sorry. There was an error.');
}
function clearPreviouseResults(){
//document.getElementById() : change $()
var header = $("header");
if (header.hasChildNodes()){
header.removeChild(header.childNodes[0]);
}
//document.getElementById() : change $()
var tableBody = $("resultsBody");
while (tableBody.childNodes.length > 0 ) {
tableBody.removeChild(tableBody.childNodes[0]);
}
}
function parseResults(response){
clearPreviouseResults();
//var results = xmlHttp.responseXML;
var results = response.responseXML;
var property = null;
var address = "";
var price = 0;
var comments = "";
var properties = results.getElementsByTagName("property");
for (var i = 0; i <properties.length; i++){
property = properties[i];
address = property.getElementsByTagName("address")[0].firstChild.nodeValue;
price = property.getElementsByTagName("price")[0].firstChild.nodeValue;
comments = property.getElementsByTagName("comments")[0].firstChild.nodeValue;
//if (price >= parseInt(document.frm.startPrice.value) ){ : change $F()
if (price >= parseInt ($F('startPrice')) ){
addTableRow(address, price, comments);
}
}
var header = document.createElement("h2");
var headerText = document.createTextNode("Results");
header.appendChild(headerText);
document.getElementById("header").appendChild(header);
document.getElementById("resultsTable").setAttribute("border", "1");
}
function addTableRow(address, price, comments) {
var row = document.createElement("tr");
var cell = createCellWithText(address);
row.appendChild(cell);
cell = createCellWithText(price);
row.appendChild(cell);
cell = createCellWithText(comments);
row.appendChild(cell);
//document.getElementById("resultsBody").appendChild(row); : change $()
$("resultsBody").appendChild(row);
}
function createCellWithText(text) {
var cell = document.createElement("td");
var textNode = document.createTextNode(text);
cell.appendChild(textNode);
return cell;
}
</script>
</head>
<body>
<h1> Search Real Estate Listing</h1>
<form name="frm">
Show listings from
<select name="startPrice" size="5">
<option value="50000">50,000</option>
<option value="100000">100,000</option>
<option value="150000">150,000</option>
</select>
to
<select name="endPrice" size="5">
<option value='100000'>100,000</option>
<option value='150000'>150,000</option>
<option value='200000'>200,000</option>
</select>
<input type="button" value="Search" onClick="doSearch()" />
</form>
<span id ="header"></span>
<table id="resultsTable" width="75%" border="0">
<tbody id="resultsBody"></tbody>
</table>
</body>
</html>
2008년 1월 23일 수요일
2008년 1월 21일 월요일
ECLIPSE - INCODING ERROR WHEN SAVE
EUC-KR 로 인코딩한 파일일 경우 허용하지 않는 문자가 포함 되어 있을때 저장이 되지 않는 경우가 있다. 이럴때는 VI로 저장 한 후에 다시 열어 보면 깨져 있는 파일을 쉽게 찾아 낼 수 있다.
2008년 1월 20일 일요일
SCRIPT - AJAX : SAMPLE DYNAMIC CONTENTS (XML)
<?xml version="1.0" encoding="UTF-8"?>
<properties>
<property>
<address>구리</address>
<price>100000</price>
<comments>412341</comments>
</property>
<property>
<address>강남</address>
<price>200000</price>
<comments>1231</comments>
</property>
<property>
<address>강서</address>
<price>150000</price>
<comments>343</comments>
</property>
<property>
<address>강동</address>
<price>50000</price>
<comments>343</comments>
</property>
</properties>
SCRIPT - AJAX : SAMPLE DYNAMIC CONTENTS (JSP)
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Dynamic Contents</title>
<script type="text/javascript">
var xmlHttp;
function createXMLHttpRequest(){
if ( window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest){
xmlHttp = new XMLHttpRequest();
}
}
function doSearch(){
createXMLHttpRequest();
xmlHttp.onreadystatechange = handleStateChange;
xmlHttp.open("GET","dynamicContents.xml", true);
xmlHttp.send(null);
}
function handleStateChange(){
if(xmlHttp.readyState == 4){
if(xmlHttp.status == 200){
clearPreviouseResults();
parseResults();
}
}
}
function clearPreviouseResults(){
var header = document.getElementById("header");
if (header.hasChildNodes()){
header.removeChild(header.childNodes[0]);
}
var tableBody = document.getElementById("resultsBody");
while (tableBody.childNodes.length > 0 ) {
tableBody.removeChild(tableBody.childNodes[0]);
}
}
function parseResults(){
var results = xmlHttp.responseXML;
var property = null;
var address = "";
var price = 0;
var comments = "";
var properties = results.getElementsByTagName("property");
for (var i = 0; i <properties.length; i++){
property = properties[i];
address = property.getElementsByTagName("address")[0].firstChild.nodeValue;
price = property.getElementsByTagName("price")[0].firstChild.nodeValue;
comments = property.getElementsByTagName("comments")[0].firstChild.nodeValue;
if (price >= parseInt(document.frm.startPrice.value) ){ //int type
addTableRow(address, price, comments);
}
}
var header = document.createElement("h2");
var headerText = document.createTextNode("Results");
header.appendChild(headerText);
document.getElementById("header").appendChild(header);
document.getElementById("resultsTable").setAttribute("border", "1");
}
function addTableRow(address, price, comments) {
var row = document.createElement("tr");
var cell = createCellWithText(address);
row.appendChild(cell);
cell = createCellWithText(price);
row.appendChild(cell);
cell = createCellWithText(comments);
row.appendChild(cell);
document.getElementById("resultsBody").appendChild(row);
}
function createCellWithText(text) {
var cell = document.createElement("td");
var textNode = document.createTextNode(text);
cell.appendChild(textNode);
return cell;
}
</script>
</head>
<body>
<h1> Search Real Estate Listing</h1>
<form name="frm">
Show listings from
<select name="startPrice">
<option value="50000">50,000</option>
<option value="100000">100,000</option>
<option value="150000">150,000</option>
</select>
to
<select>
<option value='100000'>100,000</option>
<option value='150000'>150,000</option>
<option value='200000'>200,000</option>
</select>
<input type="button" value="Search" onClick="doSearch();" />
</form>
<span id ="header"></span>
<table id="resultsTable" width="75%" border="0">
<tbody id="resultsBody"></tbody>
</table>
</body>
</html>
2008년 1월 12일 토요일
ECLIPSE - PROPERTIES EDITOR
java의 properties는 iso-8859-1만 지원 하기 때문에 한글을 쓸려면 %JAVA_HOME%\bin\native2ascii.exe 같은 프로그램을 이용해서 변환하여 사용했었다. (매우 번거로운 작업이다.)
게다가 요사이 다국어 지원을 위해 properties를 많이 이용하는데(프레임웍 등에서) 한글과 같은 문자는 properties에 직접 입력을 할 수 없다는 것은 웬지 모순된 느낌이다.
각설하고 이런 불편함을 덜어 주게 하는 것이 이 'Properties Edit Plugin' 이다.
eclipse update URL: http://propedit.sourceforge.jp/eclipse/updates/
2008년 1월 9일 수요일
JAVA SCRIPT(AJAX) - DINAMIC TIME DISPLAY
보여줄 부분
<form name="counter">
<div id="displayTime"></div>
</form>
스크립트
<SCRIPT type="text/javascript">
var xmlHttp;
function createXMLHttpRequest() {
if(window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
}
if(!xmlHttp)
alert("fail connect");
return;
}
function startRequest() {
createXMLHttpRequest();
xmlHttp.open ("GET", "http://stillrabbit/systime.jsp", true);
xmlHttp.onreadystatechange = handleStateChange;
xmlHttp.send(null);
}
function handleStateChange() {
if (xmlHttp.readyState == 4)
if (xmlHttp.status == 200){
reverse_counter(xmlHttp.responseText);
}
else if (xmlHttp.status == 404)
alert("Request URL does not exist");
else
alert("Error: status code is " + xmlHttp.status);
}
function reverse_counter(systime){
today = toTimeObject(systime.substring(6,20));
d_day = new Date(<%= 지정된 날짜 %>);
//ex (2008,11,11,00,00)
days = (d_day - today) / 1000 / 60 / 60 / 24;
daysRound = Math.floor(days);
hours = (d_day - today) / 1000 / 60 / 60 - (24 * daysRound);
hoursRound = Math.floor(hours);
minutes = (d_day - today) / 1000 /60 - (24 * 60 * daysRound) - (60 * hoursRound);
minutesRound = Math.floor(minutes);
seconds = (d_day - today) / 1000 - (24 * 60 * 60 * daysRound) - (60 * 60 * hoursRound) -
(60 * minutesRound);
secondsRound = Math.round(seconds);
sec = " 초"
min = " 분 "
hr = " 시간 "
dy = " 일 "
//다이나믹 텍스트 출력 부분
//document.counter.recom_top_table02_data02_05.value = daysRound +
//dy + hoursRound + hr + minutesRound + min + secondsRound + sec;
//폼에 출력부분
if(eval(daysRound) < 0){
document.all["displayTime"].innerHTML = "경매종료";
}else{
document.all["displayTime"].innerHTML = daysRound + dy + hoursRound + hr + minutesRound + min + secondsRound + sec;
}
// newtime =
}
function set_timer(){
startRequest();
newtime=window.setTimeout("set_timer();", 1000);
}
/////////////////////////////////////////////////////
function toTimeObject(time) { //parseTime(time)
/////////////////////////////////////////////////////
// Time 스트링을 자바스크립트 Date 객체로 변환 parameter time: Time 형식의 String
var year = time.substr(0,4);
var month = time.substr(4,2) - 1; // 1월=0,12월=11
var day = time.substr(6,2);
var hour = time.substr(8,2);
var min = time.substr(10,2);
var ss = time.substr(12,2);
return new Date(year,month,day,hour,min,ss);
}
시간을 반환하는 sysTime.jsp
<%@page contentType="text/html;charset=euc-kr" session="true" %>
<%@page import="java.text.SimpleDateFormat,java.util.*"%>
<%
java.util.Date toDate = null;
String nowDate = "";
Calendar cal = Calendar.getInstance();
SimpleDateFormat formatter = new SimpleDateFormat( "yyyyMMddHHmmss" );
String curDate = formatter.format(cal.getTime());
toDate = formatter.parse( curDate );
//nowDate = curDate.substring(0,4)+","+(Integer.parseInt(curDate.substring(4,6))-1)+","+curDate.substring(6,8)+","+curDate.substring(8,10)+","+curDate.substring(10,12)+","+curDate.substring(12,14);
//nowDate = curDate.substring(0,4)+","+(Integer.parseInt(curDate.substring(4,6))-1)+","+curDate.substring(6,8)+","+curDate.substring(8,10)+","+curDate.substring(10,12)+curDate.substring(12,14);
%>
<%=curDate%>
2008년 1월 7일 월요일
ORACLE - Multiple distinct combinations
Let's assume we have a table T with the following columns:
dc1 dc2 fc1 fc2 lc2
1 1 11 12 21
1 1 11 12 22
1 1 11 12 23
2 2 22 22 31
3 3 33 35 32
3 3 33 37 32
I want a SQL query that returns all the rows that satsfy the following criteria: dc1, dc2 has multiple distinct fc1, lc2 combinations (count > 1). For the above sample data, the SQL would return:
dc1 dc2 fc1 fc2 lc2
1 1 11 12 21
1 1 11 12 22
1 1 11 12 23
-------------------------------------------------------------------------------------------
The solution is straightforward and utilizes COUNT DISTINCT:
select T.*
from T
inner join (
select dc1
, dc2
from T
group
by dc1
, dc2
having count( distinct fc1,lc2 ) > 1
)
as multiples
on T.dc1 = multiples.dc1
and T.dc2 = multiples.dc2
Unfortunately, not every database system supports COUNT DISTINCT.
For those that don't, you can obtain the correct results, perhaps not as efficiently, with concatenation or some other expression to combine the two column values. For example, using Microsoft SQL Server syntax --
select T.*
from T
inner
join (
select dc1
, dc2
from T
group
by dc1
, dc2
having count( distinct
cast(fc1 as
varchar)
+cast(lc2 as varchar) ) > 1
) as multiples
on T.dc1 = multiples.dc1
and T.dc2 = multiples.dc2
2008년 1월 6일 일요일
ORACLE - START WITH ~ CONNECT BY PRIOR
◈ START WITH
- 계층 질의의 루트(부모행)로 사용될 행을 지정 합니다..
- 서브쿼리를 사용할 수도 있습니다.
◈ CONNECT BY
- 이 절을 이용하여 계층 질의에서 상위계층(부모행)과 하위계층(자식행)의 관계를 규정 합니다.
- 보통 PRIOR 연산자를 많이 사용 합니다..
- 서브쿼리를 사용할 수 없습니다..
- PRIOR
PRIOR 이 붙는 column 이 가져온 row 의 column을 의미한다. 즉 상위에 존재할 데이타가 되
게 된다. 어느쪽에 붙느냐 잘 따져 본다.
◈ CONNECT BY의 실행순서는 다음과 같습니다.
- 첫째 START WITH절
- 둘째 CONNECT BY 절
- 세째 WHERE 절 순서로 풀리게 되어있습니다.
◈ SYNTEX
SELECT
FROM
START WITH
CONNECT BY PRIOR
AND
ORDER SIBLINGS BY
or
SELECT
FROM
WHERE
START WITH
CONNECT BY PRIOR
ORDER SIBLINGS BY
◈ 이용
1) 쇼핑목 카테고리 관계 - 대분류, 중분류, 소분류 등을 트리 구조로
2) 게시판 에서 일반글 과 답글과의 관계 등을 트리 구조로
◈ 데이터가 많아질 경우....
- 첫째로 풀리는 START WITH job='PRESIDENT' job 컬럼에 index가 생성되어 있지 않는다면
속도를 보장할 수 없습니다.
- 그리고 둘째로 풀리는 CONNECT BY PRIOR empno = mgr 역시 PRIOR 쪽의 컬럼값이 상수가
되기 때문에 MGR컬럼에 index를 생성하여야 CONNECT BY의 속도를 보장할 수 있습니다.
- 계층구조를 CONNECT BY, START WITH로 풀면 부분범위 처리가 불가능하고 Desc으로
표현하기가 어렵 습니다.
--------------- 설명
-- 아래 예제 1
1) job 이 president 인 row 을 가져온다.
2) 가져온 row 에서 prior 이 붙은 comumn 의 데이타를 가져온다. 여긴선 empno 다.
3) PRIOR empno = mgr empno 을 mgr 로 사용하는 row 을 가져온다. 기존의 row 상위, 비교해서 가져온 row 하위에 있게 된다.
4) 이제 두번째로 가져온 row 에서 PRIOR empno = mgr 을 실행시킨다.
5) 이런 과정이 연속으로 반복되면서 최종적으로 가져온 data 는 트리 구조를 이루게 된다.(계층구조)
6) LEVEL 은 depth 을 의미한다.
7) empno = PRIOR mgr 한다면 가져온 row 의 mgr을 기준으로 비교하여 data을 가져오게 된다.
예제 2 참조
---- 예제 1
SELECT LEVEL,empno,ename, mgr, job -- LEVEL 은 depth 을 의미한다.
FROM emp
START WITH job = 'PRESIDENT' -- 직업이 PRESIDENT를 기준으로
CONNECT BY PRIOR empno = mgr -- 사원(empno)과 관리자(mgr)의 관계를 계층
-- level 을 공백으로 찍어 본다.
SELECT LPAD(' ', 4*(LEVEL-1)) || ename ename,LEVEL, empno, mgr, job
FROM emp
START WITH job = 'PRESIDENT' -- 직업이 PRESIDENT를 기준으로
CONNECT BY PRIOR empno = mgr -- 사원(empno)과 관리자(mgr)의 관계를 계층
-- 결과치
ENAME LEVEL EMPNO MGR JOB
KING 1 7839 PRESIDENT
JONES 2 7566 7839 MANAGER
SCOTT 3 7788 7566 ANALYST
ADAMS 4 7876 7788 CLERK
FORD 3 7902 7566 ANALYST
SMITH 4 7369 7902 CLERK
JJS 3 9000 7566 ANALIST
BLAKE 2 7698 7839 MANAGER
ALLEN 3 7499 7698 SALESMAN
WARD 3 7521 7698 SALESMAN
MARTIN 3 7654 7698 SALESMAN
TURNER 3 7844 7698 SALESMAN
JAMES 3 7900 7698 CLERK
CLARK 2 7782 7839 MANAGER
MILLER 3 7934 7782 CLERK
----예제 2 - PRIOR 위치 변경
SELECT LPAD(' ', 4*(LEVEL-1)) || ename ename,LEVEL, empno, mgr, job -- level 을 공백으로 찍어 본다.
FROM emp
START WITH job = 'CLERK' -- 직업이 CLERK를 기준으로
CONNECT BY empno = PRIOR mgr -- 사원(empno)과 관리자(mgr)의 관계를 계층
-- 결과치
ENAME LEVEL EMPNO MGR JOB
SMITH 1 7369 7902 CLERK
FORD 2 7902 7566 ANALYST
JONES 3 7566 7839 MANAGER
KING 4 7839 PRESIDENT
ADAMS 1 7876 7788 CLERK
SCOTT 2 7788 7566 ANALYST
JONES 3 7566 7839 MANAGER
KING 4 7839 PRESIDENT
JAMES 1 7900 7698 CLERK
BLAKE 2 7698 7839 MANAGER
KING 3 7839 PRESIDENT
MILLER 1 7934 7782 CLERK
CLARK 2 7782 7839 MANAGER
KING 3 7839 PRESIDENT
---- 예제 3: 조건 절 사용
-- 1) WHERE 절 사용
SELECT LPAD(' ', 4*(LEVEL-1)) || ename ename,LEVEL, empno, mgr, job -- level 을 공백으로 찍어 본다.
FROM emp
WHERE ename LIKE '%K%'
START WITH job = 'PRESIDENT' -- 직업이 PRESIDENT를 기준으로
CONNECT BY PRIOR empno = mgr -- 사원(empno)과 관리자(mgr)의 관계를 계층
-- 2) CONNECT BY PRIOR 아래에 AND 사용
SELECT LPAD(' ', 4*(LEVEL-1)) || ename ename,LEVEL, empno, mgr, job -- level 을 공백으로 찍어 본다.
FROM emp
START WITH job = 'PRESIDENT' -- 직업이 PRESIDENT를 기준으로
CONNECT BY PRIOR empno = mgr -- 사원(empno)과 관리자(mgr)의 관계를 계층
AND ename LIKE '%K%'
-- 3) LEVEL 조건 사용
SELECT LPAD(' ', 4*(LEVEL-1)) || ename ename, empno, mgr, job
FROM emp
START WITH job='PRESIDENT'
CONNECT BY PRIOR empno =mgr
AND LEVEL <= 2
---- 예제4 : 각 label별로 급여의 합과 인원수를 구하는 예제
SELECT LEVEL, SUM(sal) salTotal,COUNT(empno) empnCnt
FROM emp
START WITH job='PRESIDENT'
CONNECT BY PRIOR empno=mgr
GROUP BY LEVEL
ORDER BY LEVEL
-- 결과치
LEVEL salTotal empnCnt
---------- ---------- ----------
1 5000 1
2 8275 3
3 13850 8
4 1900 2
ORACLE - FUNCTION TIP
[문자열]
1 . CONCAT( column1expression1 ,column2expression2 )
CONCAT('Good','String') --> GoodString : 와 같은 역할을 한다.
2 . SUBSTR(columnexpression, m [,n]) : m값이 음수면 문자값의 끝부터 (글자기준 )
SUBSTR('String',1,3) --> Str : 1번째부터 3개의 문자를 리턴한다.
3. SUBSTRB(columnexpression, m [,n]) : m값이 음수면 문자값의 끝부터 (바이트기준 )
SUBSTRB('String',1,3) --> Str : 1번째부터 3개의 문자를 리턴한다
4. INITCAP( columnexpression )
INITCAP('string') --> String : 첫글자만 대문자, 나머지글자는 소문자로 변환
5. UPPER( columnexpression )
UPPER('String') --> STRING : 대문자로 변환
6. LOWER( columnexpression )
LOWER('String') --> string : 소문자로 변환
7. LPAD( columnexpression,n,'string' ) : n 은 전체 길이와 채울문자(숫자가능)
LPAD('String',10,'*') --> ****String
8. RPAD('String',10,'*') --> String****
9. LENGTH( columnexpression )
LENGTH('String') --> 6 : 문자열의 길이를 리턴한다.
10. REPLACE(column 0 , 'r') L01102 => Lr11r2
11. INSTR( columnexpression )
INSTR('String','r') --> 3 : 문자열에 'r'이 몇번째 위치인지를 (숫자)리턴
12. LTRIM(' String') --> 'String' : 문자열의 왼쪽 공백을 버린다.
13. RTRIM('String ') --> 'String' : 문자령의 오른쪽 공백을 버린다.
* TRIM(leading/tailing/both, trim_character FROM trim_source )
TRIM( 'S' FROM 'SSMITH') --> MITH
[ 숫자 ]
1. ROUND(45.926, 2) --> 45.93 : 소수점 두자리수까지 보여주면서 반올림한다.
SELECT ROUND(45.923,2), ROUND(45.923,0), ROUND(45.923,-1) FROM DUAL
==> 45.92 46 50
2. TRUNC(45.926, 2) --> 45.92 : 소수점 두자리까지만 보여주고 나머지는 버린다.
SELECT TRUNC(45.923,2), TRUNC(45.923), TRUNC(45.923,-1) FROM DUAL
==> 45.92 45(n이 생략된면 일의 자리까지 남기고 버린다.) 40
3. MOD(1600,300) --> 100 : 1600을 300으로 나누고 나머지를 리턴한다.
[ Date ]
* SYSTEM 날짜를 갖고 오는 방법.
SELECT sysdate FROM dual
date + number : date에 number만큼 후의 날자를 보여준다.
date - number : date에 number만큼 전의 날자를 보여준다.
date1 - date2 : date1에서 date2 까지의 총 일수를 보여준다.( date1+date2는 X )
date1 + 숫자/24 : date1에서 시간을 더해 날짜를 보여준다.
MONTHS_BETWEEN('01-SEP-95','11-JAN-94') --> 19.6774194
; 두날짜 사이의 달수를 보여준다.
ADD_MONTHS('11-JAN-94', 6) --> 11-JUL-94
; 날짜에 6개월을 더한 날자를 보여준다.
NEXT_DAY('01-SEP-95','FRIDAY') --> '08-SEP-95'
; 해당일 다음에 오는 FRIDAY의 일자를 보여준다.
('SUNDAY'는 1, 'MONDAY'는 2...이런식으로 숫자를 써줘도 된다.)
LAST_DAY('01-SEP-95') --> '30-SEP-95'
; 해당월의 마지막날자를 보여준다.
ROUND('25-JUL-95','MONTH')--> 01-AUG-95
ROUND('25-JUL-95','YEAR')--> 01-JAN-96
TRUNC('25-JUL-95','MONTH') --> 01-JUL-95
TRUNC('25-JUL-95','YEAR') --> 01-JAN-95
[ Conversion Functions ]
nlsparams : 십진수, 그룹구분자, 지역 통화 기호, 국제 통화 기호
TO_CHAR(date,['format'],[nlsparams]) : date를 format에 맞게 문자열로 변환한다.
- Date Format Elements
YYYY --> 1999 (년출력) , YEAR --> nineteen ninety-nine (년출력)
MM --> 12 (월출력) , MONTH --> DECEMBER (월출력), MON --> DEC
D --> 요일을 숫자로 리턴한다.(일요일은 1, 월요일은 2...)
DD --> 07 (달의 일출력)
DDD --> 200 (연의 일출력)그 해의 총 몇 일째인가를 리턴한다.
DAY --> MONDAY (요일출력) DY-->MON
CC --> 20 (몇 세기인지를 보여준다.)
WW --> 그 해의 몇 번째 주인가를 리턴한다.
W --> 그 달의 몇 번째 주인가를 리턴한다.
HH or HH12 or HH24 / MI(0-59분) / SS(0-59초)
* 문자열은 " " 묶어 추가한다 DD " of " MONTH --> 12 of DECEMBER
* 숫자 접미어는 숫자를 문자로 표기. TH(4->4TH)/ SP(4->FOUR)/ SPTH or THSP(4->FOURTH)
TO_CHAR(number,'format',[nlsparams]) : number를 format에 맞게 문자열로 변환한다.
- Number Format Elements
9 : 999,999 --> 1,234 $: 부동 달러 기호 $99999 -> $1234
0 : 099999 --> 001234 99.999EEEE -> 1.234E+03 B: 0값을 공백으로
L : L99,999 --> FF1,234 (NLS_CURRENCY에 설정되어있는 값이 L로 보여진다.)
TO_NUMBER(char,['format'],[nlsparams]) : 숫자형태의 문자열을 숫자로 변한한다.
TO_DATE(char,['format'],[nlsparams]):날자형태의 문자열을 format에 맞게 날자형식으로 변환 한다.
[ NVL Funcion ]
: 값이 null일 때 설정값을 보여준다.
NVL(number_column, 0) : null일 때 0을 보여준다.
NVL(date_column, '01-JAN-95') : null일 때 '01-JAN-95'를 보여준다.
NVL(character_column, 'Empty') : null일 때 'Empty'를 보여준다.
* column Type과 표현식의 type이 반드시 일치해야 한다.
[ DECODE Function ]
: CASE or IF-THEN-ELSE 형식과 비슷하다.
DECODE(col/expression, search1, result1 [,search2,result2,…] [,default])
2008년 1월 5일 토요일
ECLIPSE - RESIN IN ECLIPSE 3.X
1. INSTALL RESIN PLUG IN
Help -> Software Updates -> Find Install 에서 [New Remote Site]를 선택한 후
Name : Improve's Eclipse plugin site
URL : http://www.improve-technologies.com/alpha/updates/site.xml를 입력한 후 plug-in을 설치합니다.(디폴트로 설치하면 되기때문에 자세한 설치과정은 생략합니다.)
2. CONFIG
Windows -> Preferences -> Resin 를 선택하여 설치한 resin version 과 home directory를 선택하고 java compiler의 위치를 선택합니다.
그리고 resin.conf를 프로젝트에 맞게 . 각 버젼에 맞는 설정은 resin site 참고.
4. LUNCHER CONFIG
Run -> Run을 띄웁니다.[Main] tab에서 Name과 Project 명을 선택하고 resin conf파일 위치를 선택합니다.
[Classpath]에 {JAVA_HOME}/lib/tools.jar를
debug를 선택하면 debug 모드로 작동한다. (jsp는 작동 안할 수도 있다.)
2008년 1월 2일 수요일
ORACLE - ABOUT ROWNUM & TIP(PAGING)
from 5 (select id, data 6 from t 7 order by id, rowid) a 8 where rownum <= 150 9 ) 10 where rnum >= 148; ID DATA RNUM ------- ---------- ----------- 0 45 1480 99 1490 41 150
SQL>SQL> select * 2 from 3 (select a.*, rownum rnum 4 from 5 (select id, data 6 from t 7 order by id, rowid) a 8 where rownum <= 151 9 ) 10 where rnum >= 148; ID DATA RNUM ------- ---------- ----------- 0 45 1480 99 1490 41 1500 45 151 |