2011년 10월 28일 금요일

우분투 11.10에 Sun JDK 설치하기


Synaptic Package Manager 실행  (설치 않되어 있다면 설치)

우분투 소프트웨어 센터 실행
설정 > 저장소 (Settings > Repositories)
기타 소프트웨어 탭
추가 클릭하고 ppa:ferramroberto/java 입력하고 소스추가 클릭
닫기
새로고침

OpenJDK 삭제
Sun-Java 로 검색해서 패키지 설치

2011년 10월 11일 화요일

JOIN문을 이용한 UPDATE 쿼리


UPDATE T1
SET T1.P_CODE_VALUE1 = T2.P_CODE1
,T1.P_CODE_VALUE2 = T2.P_CODE2
FROM TMAST02TT T1
INNER JOIN TCODE02TT T2 ON T1.YEAR = T2.YEAR AND T1.P_CODE = T2.T_CODE
WHERE 1=1
AND T1.GUBUN = :gubun AND T1.YEAR = :year AND T1.SEASON = :season AND T1.SCHOOL = :school 
AND T1.BOKJONG = :bokjong AND T1.PUMOK = :pumok AND T1.SAYANG = :sayang AND T1.P_CODE = :pCode
AND T2.SEQ = :seq

2011년 9월 4일 일요일

ubuntu nabi 설치

1. nabi를 설치
$sudo apt-get install nabi

2. im-swich 설치
$sudo im-switch

3. nabi를 기본으로 설정
$sudo im-switch -c

4. reboot 또는 alt+SysRq+k

2011년 9월 1일 목요일

tomcat session timeout 변경

[tomcat]이 설치된 디렉토리/conf/web.xml 에서 아래 부분을 편집
단위는 분, 기본은 30분으로 설정되어 있음


<session-config>
        <session-timeout>360</session-timeout>
</session-config>

** 세션 타임아웃 적용 우선순위

1. 프로그램에 코딩된 session.setMaxInactiveInterval(int)
2. 각 웹 어플리케이션의 WEB-INF/web.xml
3. [tomcat설치디렉토리]/conf/web.xml

2011년 8월 24일 수요일

sdcard path 구하기


1. 경로구하기
android.os.Environment.getExternalStorageDirectory().getAbsolutePath();

2. SDCard에 쓰기 권한 부여
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

android DatePickerDialog


main.xml
********************************************************************************
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical">
<EditText android:id="@+id/airedDate" android:layout_width="fill_parent"
android:layout_height="wrap_content"  android:focusableInTouchMode="false" />
</LinearLayout>
********************************************************************************

MainActivity.java
********************************************************************************
public class MainActivity extends Activity {
static final int AIRED_DATE_DIALOG_ID = 1;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

EditText airedDate = (EditText) findViewById(R.id.airedDate);
airedDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDialog(AIRED_DATE_DIALOG_ID);
}
});
Calendar c1 = Calendar.getInstance();
String yyyy = Integer.toString(c1.get(Calendar.YEAR));
String mm = Integer.toString(c1.get(Calendar.MONTH)+1);
String dd = Integer.toString(c1.get(Calendar.DAY_OF_MONTH));
if (mm.length() < 2)
mm = "0"+mm;
if (dd.length() < 2)
dd = "0"+dd;
airedDate.setText(yyyy+"-"+mm+"-"+dd);
}

private DatePickerDialog.OnDateSetListener airedDateSetListener = new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
String s = Utils.toDate(year, monthOfYear+1, dayOfMonth, "-");
EditText airedDate = (EditText) findViewById(R.id.airedDate);
airedDate.setText(s);
}
};

@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case AIRED_DATE_DIALOG_ID:
EditText airedDate = (EditText) findViewById(R.id.airedDate);
Calendar c = Calendar.getInstance();
try {
c = Utils.getCalendar(airedDate.getText().toString());
} catch (Exception e) {
}
return new DatePickerDialog(this, airedDateSetListener, c.get(Calendar.YEAR), c.get(Calendar.MONDAY), c.get(Calendar.DAY_OF_MONTH));
}
return null;
}
}
********************************************************************************


Utils.java
********************************************************************************
public class Utils {
public static Calendar getCalendar(String yyyy, String mm, String dd) throws Exception {
Calendar c = Calendar.getInstance();

try {
int y = Integer.parseInt(yyyy);
int m = Integer.parseInt(mm)-1;
int d = Integer.parseInt(dd);

c.set(Calendar.YEAR, y);
c.set(Calendar.MONTH, m);
c.set(Calendar.DAY_OF_MONTH, d);
} catch (Exception e) {
throw e;
}
return c;
}

public static Calendar getCalendar(String yyyymmdd) throws Exception {
String[] ymd = null;
try {
ymd = yyyymmdd.split("-");
} catch (Exception e) {
throw e;
}
return getCalendar(ymd[0], ymd[1], ymd[2]);
}

public static String toDate(int yyyy, int mm, int dd, String sep) {
String result = Integer.toString(yyyy);
result += "-";
if (mm < 10)
result += "0"+Integer.toString(mm);
else
result += Integer.toString(mm);
result += "-";
if (dd < 10)
result += "0"+Integer.toString(dd);
else
result += Integer.toString(dd);

return result;
}
}
********************************************************************************

2011년 8월 23일 화요일

MSSQL 요척 조회 함수


USE [skoolooks_erp]
GO
/****** Object:  UserDefinedFunction [dbo].[FN_GET_TCODE_YOCHUK]    Script Date: 08/23/2011 17:31:07 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,yskim>
-- Create date: <Create Date, ,20110804>
-- Description: <Description, , >

-- 요척계산 예외 (2011-08-22)
-- 1. 다음 조건을 만족할 경우
-- A. 복종이 스커트(S)
-- B. TCODE03TT.S_CODE_NAME='앞판'
-- C. TCODE01TT.CODE_NAME='주름종류' && TCODE01TT.CODE_NAME='주름수'
--
-- 2. TORDR02TT.P_CODE_VALUE1 값은 '주름종류'와 '주름수'에 해당하는 요척 값은 TGRUP01TT.YOCHUK 조회
-- A. TGRUP01TT.P_CODE1 = '주름종류'의 P_CODE_VALUE1
-- B. TGRUP01TT.P_CODE2 = '주름수'의 P_CODE_VALUE1

-- 3. 1의 조건에 해당하지 않거나 TORDR02TT.P_CODE_VALUE2 값은 기존 프로세스로 YOCHUK 값을 산정
-- =============================================
ALTER FUNCTION [dbo].[FN_GET_TCODE_YOCHUK]
(
@V_GUBUN VARCHAR(20)
, @V_YEAR VARCHAR(8)
, @V_SEASON VARCHAR(2)
, @V_SCHOOL VARCHAR(10)
, @V_BOKJONG VARCHAR(2)
, @V_PUMOK VARCHAR(2)
, @V_SAYANG VARCHAR(2)
, @V_CHASU VARCHAR(2)
)
RETURNS DECIMAL(3,2)
AS
BEGIN
-- Declare the return variable here
--DECLARE @ResultVar VARCHAR(4000)
DECLARE @ResultVar DECIMAL(3,2) = 0.00
DECLARE @PYochuk1 DECIMAL(3,2) = 0.00
DECLARE @PYochuk2 DECIMAL(3,2) = 0.00
DECLARE @PPCodeValue1 VARCHAR(100)
DECLARE @PPCodeValue2 VARCHAR(100)
DECLARE @PSCodeName VARCHAR(100)
DECLARE @PCodeName VARCHAR(100)

DECLARE @PCode1 VARCHAR(100) -- TGRUP01TT.P_CODE1
DECLARE @PCode2 VARCHAR(100) -- TGRUP01TT.P_CODE2
DECLARE @PGrupYochuk DECIMAL(3,2) = 0.00 -- TGRUP01TT.YOCHUK

-- Add the T-SQL statements to compute the return value here
DECLARE MY_CURSOR CURSOR FOR
SELECT
YOCHUK1, YOCHUK2
, P_CODE_VALUE1, P_CODE_VALUE2
, S_CODE_NAME, CODE_NAME
FROM (
SELECT
ISNULL((SELECT YOCHUK FROM TCODE02TT X WHERE X.YEAR=T1.YEAR AND X.T_CODE=T2.P_CODE AND X.P_CODE1=T2.P_CODE_VALUE1),0.00) AS YOCHUK1
, ISNULL((SELECT YOCHUK FROM TCODE02TT X WHERE X.YEAR=T1.YEAR AND X.T_CODE=T2.P_CODE AND X.P_CODE2=T2.P_CODE_VALUE2),0.00) AS YOCHUK2
, T2.P_CODE_VALUE1, T2.P_CODE_VALUE2
, T1.BOKJONG
, TC3.S_CODE, TC3.S_CODE_NAME
, TC1.CODE_NAME
, T2.P_CODE
FROM TORDR01TT T1
LEFT OUTER JOIN TORDR02TT T2
ON T1.GUBUN = T2.GUBUN AND T1.YEAR = T2.YEAR AND T1.SEASON = T2.SEASON AND T1.SCHOOL = T2.SCHOOL
AND T1.BOKJONG = T2.BOKJONG AND T1.PUMOK = T2.PUMOK AND T1.SAYANG = T2.SAYANG AND T1.CHASU=T2.CHASU
INNER JOIN TCODE03TT TC3 ON TC3.SEASON=SUBSTRING(T2.P_CODE,1,1) AND TC3.SEX=SUBSTRING(T2.P_CODE,2,1) AND TC3.BOKJONG=SUBSTRING(T2.P_CODE,3,1) AND TC3.S_CODE=SUBSTRING(T2.P_CODE,4,1)
INNER JOIN TCODE01TT TC1 ON TC1.YEAR=T2.YEAR AND TC1.T_CODE=T2.P_CODE
WHERE 1=1
AND T1.GUBUN = @V_GUBUN AND T1.YEAR = @V_YEAR AND T1.SEASON = @V_SEASON AND T1.SCHOOL = @V_SCHOOL
AND T1.BOKJONG = @V_BOKJONG AND T1.PUMOK = @V_PUMOK AND T1.SAYANG = @V_SAYANG AND T1.CHASU = @V_CHASU
) T1

OPEN MY_CURSOR;

FETCH NEXT FROM MY_CURSOR
INTO @PYochuk1, @PYochuk2, @PPCodeValue1, @PPCodeValue2, @PSCodeName, @PCodeName;

WHILE @@FETCH_STATUS = 0
BEGIN

IF @PSCodeName='앞판' AND @PCodeName='주름종류'
BEGIN
SELECT @PCode1 = @PPCodeValue1
END
ELSE IF @PSCodeName='앞판' AND @PCodeName='주름수'
BEGIN
SELECT @PCode2 = @PPCodeValue1
END
ELSE
BEGIN
SELECT @ResultVar = @ResultVar + @PYochuk1
END

SELECT @ResultVar = @ResultVar + @PYochuk2

FETCH NEXT FROM MY_CURSOR
INTO @PYochuk1, @PYochuk2, @PPCodeValue1, @PPCodeValue2, @PSCodeName, @PCodeName;
END;

SELECT @PGrupYochuk = ISNULL(YOCHUK, 0.00) FROM TGRUP01TT T1
WHERE T1.YEAR = @V_YEAR AND T1.BOKJONG = @V_BOKJONG AND P_CODE1=@PCode1 AND P_CODE2=@PCode2

CLOSE MY_CURSOR;
DEALLOCATE MY_CURSOR;

-- Return the result of the function
RETURN @ResultVar;

END

자바 배열 for 구문


새로운(!) 자바 for 구문
아래와 같이 증감치 등등을 생략하고 사용 가능

int[] numArray = { 10, 20, 30, 40, 50};
for (int i: numArray) {
  System.out.println(i);
}

MSSQL 형변환 (CAST, CONVERT)

한 데이터 형식의 식을 다른 데이터 형식의 식으로 변환

syntax

CAST
CAST (expression AS data_type [ (length ) ] )

CONVERT
CONVERT (data_type [ (length ) ] ,expression [ ,style ] )





expression
유효한 입니다.
data_type
대상 데이터 형식입니다. xmlbigint 및 sql_variant가 있습니다. 별칭 데이터 형식은 사용할 수 없습니다. 사용 가능한 데이터 형식에 대한 자세한 내용은 데이터 형식(Transact-SQL)을 참조하십시오.
length
대상 데이터 형식의 길이를 지정하는 선택적 정수입니다. 기본값은 30입니다.
style
CONVERT 함수가 expression을 변환하는 방법을 지정하는 정수 식입니다. 스타일이 NULL이면 NULL이 반환됩니다. 범위는 data_type에 의해 결정됩니다. 자세한 내용은 주의 섹션을 참조하십시오.


data_type으로 변환된 expression을 반환합니다.


날짜 및 시간 스타일

expression이 날짜 또는 시간 데이터 형식이면 style은 다음 표에 있는 값 중 하나일 수 있습니다. 다른 값은 0으로 처리됩니다. SQL Server는 쿠웨이트 알고리즘을 사용하여 아랍어 스타일의 날짜 형식을 지원합니다.




번호출력값사용방법
0Feb 22 2006 4:26PMCONVERT(CHAR(19), CURRENT_TIMESTAMP, 0)
102/22/06CONVERT(CHAR(8), CURRENT_TIMESTAMP, 1)
206.02.22CONVERT(CHAR(8), CURRENT_TIMESTAMP, 2)
322/02/06CONVERT(CHAR(8), CURRENT_TIMESTAMP, 3)
422.02.06CONVERT(CHAR(8), CURRENT_TIMESTAMP, 4)
522-02-06CONVERT(CHAR(8), CURRENT_TIMESTAMP, 5)
622 Feb 06CONVERT(CHAR(9), CURRENT_TIMESTAMP, 6)
7Feb 22, 06CONVERT(CHAR(10), CURRENT_TIMESTAMP, 7)
816:26:08CONVERT(CHAR(8), CURRENT_TIMESTAMP, 8)
9Feb 22 2006 4:26:08:020PMCONVERT(CHAR(26), CURRENT_TIMESTAMP, 9)
1002-22-06CONVERT(CHAR(8), CURRENT_TIMESTAMP, 10)
1106/02/22CONVERT(CHAR(8), CURRENT_TIMESTAMP, 11)
12060222CONVERT(CHAR(6), CURRENT_TIMESTAMP, 12)
1322 Feb 2006 16:26:08:020CONVERT(CHAR(24), CURRENT_TIMESTAMP, 13)
1416:26:08:037CONVERT(CHAR(12), CURRENT_TIMESTAMP, 14)
202006-02-22 16:26:08CONVERT(CHAR(19), CURRENT_TIMESTAMP, 20)
212006-02-22 16:26:08.037CONVERT(CHAR(23), CURRENT_TIMESTAMP, 21)
2202/22/06 4:26:08 PMCONVERT(CHAR(20), CURRENT_TIMESTAMP, 22)
232006-02-22CONVERT(CHAR(10), CURRENT_TIMESTAMP, 23)
2416:26:08CONVERT(CHAR(8), CURRENT_TIMESTAMP, 24)
252006-02-22 16:26:08.037CONVERT(CHAR(23), CURRENT_TIMESTAMP, 25)
100Feb 22 2006 4:26PMCONVERT(CHAR(19), CURRENT_TIMESTAMP, 100)
10102/22/2006CONVERT(CHAR(10), CURRENT_TIMESTAMP, 101)
1022006.02.22CONVERT(CHAR(10), CURRENT_TIMESTAMP, 102)
10322/02/2006CONVERT(CHAR(10), CURRENT_TIMESTAMP, 103)
10422.02.2006CONVERT(CHAR(10), CURRENT_TIMESTAMP, 104)
10522-02-2006CONVERT(CHAR(10), CURRENT_TIMESTAMP, 105)
10622 Feb 2006CONVERT(CHAR(11), CURRENT_TIMESTAMP, 106)
107Feb 22, 2006CONVERT(CHAR(12), CURRENT_TIMESTAMP, 107)
10816:26:08CONVERT(CHAR(8), CURRENT_TIMESTAMP, 108)
109Feb 22 2006 4:26:08:067PMCONVERT(CHAR(26), CURRENT_TIMESTAMP, 109)
11002-22-2006CONVERT(CHAR(10), CURRENT_TIMESTAMP, 110)
1112006/02/22CONVERT(CHAR(10), CURRENT_TIMESTAMP, 111)
11220060222CONVERT(CHAR(8), CURRENT_TIMESTAMP, 112)
11322 Feb 2006 16:26:08:067CONVERT(CHAR(24), CURRENT_TIMESTAMP, 113)
11416:26:08:067CONVERT(CHAR(12), CURRENT_TIMESTAMP, 114)
1202006-02-22 16:26:08CONVERT(CHAR(19), CURRENT_TIMESTAMP, 120)
1212006-02-22 16:26:08.080CONVERT(CHAR(23), CURRENT_TIMESTAMP, 121)
1262006-02-22T16:26:08.080CONVERT(CHAR(23), CURRENT_TIMESTAMP, 126)
1272006-02-22T16:26:08.080CONVERT(CHAR(23), CURRENT_TIMESTAMP, 127)
13024 ???? 1427 4:26:08:080PMCONVERT(CHAR(32), CURRENT_TIMESTAMP, 130)
13124/01/1427 4:26:08:080PMCONVERT(CHAR(25), CURRENT_TIMESTAMP, 131)

2011년 8월 15일 월요일

Tomcat6 Context 설정


Tomcat5.5 부터 Context 설정이 변경되었다.
이전 버전에서는 server.xml 에 저장되어는데 5.5 부터는 아래와 같은 방식으로 적용이 가능하다.

Context elements may be explicitly defined:
  • In the $CATALINA_BASE/conf/context.xml file: the Context element information will be loaded by all webapps.
  • In the $CATALINA_BASE/conf/[enginename]/[hostname]/context.xml.default file: the Context element information will be loaded by all webapps of that host.
  • In individual files (with a ".xml" extension) in the $CATALINA_BASE/conf/[enginename]/[hostname]/ directory. The name of the file (less the .xml extension) will be used as the context path. Multi-level context paths may be defined using #, e.g. foo#bar.xml for a context path of /foo/bar. The default web application may be defined by using a file called ROOT.xml.
  • Only if a context file does not exist for the application in the $CATALINA_BASE/conf/[enginename]/[hostname]/, in an individual file at /META-INF/context.xml inside the application files. If the web application is packaged as a WAR then /META-INF/context.xml will be copied to $CATALINA_BASE/conf/[enginename]/[hostname]/ and renamed to match the application's context path. Once this file exists, it will not be replaced if a new WAR with a newer /META-INF/context.xml is placed in the host's appBase.
  • Inside a Host element in the main conf/server.xml.

참고: http://tomcat.apache.org/tomcat-6.0-doc/config/context.html

아래는 server.xml 에 host 관련 설정만 하고 context는 $CATALINA_BASE/conf/[enginename]/[hostname] 에 지정하는 방식으로 설정하는 방법이다.

1. server.xml 파일에 이전과 같은 방식으로 host 를 지정

      <Host name="localhost"  appBase="/some/host/path" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
      </Host>

2. ROOT context 설정 ($CATALINA_BASE/conf/Catalina/localhost/ROOT.xml)
루트 컨텍스트 이름은 ROOT.xml 에 지정되야 한다.
Virtual Host를 적용해서 호스트명이 localhost가 아니라면 localhost를 해당 호스트 명으로 변경한다. (server.xml에서 지정한 이름)
<?xml version='1.0' encoding='utf-8'?>
<Context path="/board" docBase="/context/path/root/webapps" reloadable="true">

</Context>


3. 추가 context 설정 ($CATALINA_BASE/conf/Catalina/localhost/board.xml)

<?xml version='1.0' encoding='utf-8'?>
<Context path="/board" docBase="/context/path/board/webapps" reloadable="true">

</Context>


2011년 8월 12일 금요일

Servlet Container에서 인코딩 설정하기



1. filter를 이용하기
(1) 요구사항: Container가 servlet 2.3을 지원해야 한다.
(2) 방법
(a) 아래와 같은 필터 클래스 작성
--------------------------------------------------------------------------------
package net.javajigi.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
 * ServletRequest객체에 인코딩을 설정하는 Filter클래스.
 *
 * @web.filter name="Encoding Filter"
 *       display-name="Encoding Filter"
 *  
 * @web.filter-init-param name="encoding"
 *         value="EUC-KR"     
 *
 * @web.filter-mapping url-pattern="/*"
 *        
 */
public class EncodingFilter implements Filter {
 private String encoding = null;
 protected FilterConfig filterConfig = null;
 public void destroy() {
  this.encoding = null;
  this.filterConfig = null;
 }
 /**
  * ServletRequest객체에 web.xml에서 전달된 인코딩을 설정하는 메써드.
  */
 public void doFilter(
  ServletRequest request,
  ServletResponse response,
  FilterChain chain)
  throws IOException, ServletException {
  if (request.getCharacterEncoding() == null) {
   if (encoding != null) {
    request.setCharacterEncoding(encoding);
   }
  }
  chain.doFilter(request, response);
 }
 /**
  * web.xml에서 전달된 인코딩 값을 초기화하는 메써드.
  */
 public void init(FilterConfig filterConfig) throws ServletException {
  this.filterConfig = filterConfig;
  this.encoding = filterConfig.getInitParameter("encoding");
 }
 public FilterConfig getFilterConfig() {
  return filterConfig;
 }
 public void setFilterConfig(FilterConfig cfg) {
  filterConfig = cfg;
 }
}
--------------------------------------------------------------------------------

(b) web.xml에 아래 설정을 추가
--------------------------------------------------------------------------------
  <filter>
   <filter-name>Encoding Filter</filter-name>
   <display-name>Encoding Filter</display-name>
   <filter-class>net.javajigi.filter.EncodingFilter</filter-class>
   <init-param>
    <param-name>encoding</param-name>
    <param-value>EUC-KR</param-value>
   </init-param>
  </filter>
 
  <filter-mapping>
   <filter-name>Encoding Filter</filter-name>
   <url-pattern>/*</url-pattern>
  </filter-mapping>
--------------------------------------------------------------------------------

2. request 객체 이용
request 객체를 처리하기 전에 아래와 같이 인코딩을 적용
--------------------------------------------------------------------------------
request.setCharacterEncoding("euc-kr");
--------------------------------------------------------------------------------

FireBird Quick Start Guide 요약



 1. sysdba 비밀번호 바꾸기
gsec -user sysdba -pass masterkey -mo sysdba -pw newpassword
* sysdba의 초기 비밀번호는 masterkey이다

2. 사용자 추가
gsec -user sysdba -pass masterkey -add new_account -pw new_account_password

3. 보안을 위해 alias 사용을 권장한다. aliases.conf를 편집하면 된다.
아래와 같은 형식으로 작성한다.
--------------------------------------------------------------------------------
poker = E:\Games\Data\PokerBase.fdb
blackjack.fdb = C:\Firebird\Databases\cardgames\blkjk_2.fdb
--------------------------------------------------------------------------------

4. 연결 문자열 형식 (TCP/IP connection strings)
(1) a server name or IP address
(2) a colon (“:”)
(3) either the absolute path + filename on the server machine, or an alias defined on the server machine.
siamang:C:\Biology\Data\Primates\Apes\populations.fdb

5. ISQL을 이용해서 연결하기 (로컬)
C:\Program Files\Firebird\Firebird_2_0\bin> isql
SQL>Use CONNECT or CREATE DATABASE to specify a database
SQL>CONNECT ..\examples\empbuild\employee.fdb user SYSDBA password masterkey;

6. DB 생성
SQL>CREATE DATABASE '..\examples\empbuild\test.fdb' page_size 8192
CON>user 'SYSDBA' password 'masterkey';

7. 데이터 베이스 생성확인
SQL>SELECT * FROM RDB$RELATIONS;#

log4j 사용하기



log4j 설정

* 이클립스를 사용하고 Dynamic Web Project 라는 가정하에 설명

다운로드
http://logging.apache.org/log4j/1.2/download.html


설정
log4j는 log4j.properties 파일로 설정
src 디렉토리 아래에 log4j.properties 파일을 생성
(파일 저장시 이클립스가 log4j.properties 파일을 WEB-INF/classes로 알아서 복사함)
log4j.properties 파일을 아래와 같이 편집

--------------------------------------------------------------------------------
log4j.rootLogger=INFO, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Print only messages of level ERROR or above in the package noModule.
log4j.logger.noModule=WARN

# Pattern to output the caller's file name and line number.
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %5p (%c:%L) - %m%n

# file log
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.File=C:/app/apache-tomcat-6.0.29/logs/myapp_erp.log
log4j.appender.logfile.MaxFileSize=100000KB
log4j.appender.logfile.DatePattern='.'yyyy-MM-dd
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=[%d{HH:mm:ss}][%-5p](%F:%L) - %m%n

# OpenSymphony Stuff
log4j.logger.com.opensymphony=WARN
log4j.logger.org.apache.struts2=WARN

# Spring Stuff
log4j.logger.org.springframework=WARN

########################## APPLICATION LOG CONFIGURATION ###########################

log4j.logger.com.test=DEBUG, logfile
log4j.logger.com.test.Tester=INFO, logfile

log4j.logger.com.test=DEBUG, stdout
log4j.logger.com.test.Tester=INFO, stdout
--------------------------------------------------------------------------------

APPLICATION LOG CONFIGURATION 이후의 내용을 수정
log4j.logger 이후에 설정할 패키지명 역순으로 적고 로그레벨과 appender 이름을 입력
위의 경우 com.test.Tester 클래스는 INFO level로 com.test 이하에 속한 패키지의 클래스들은 DEBUG 레벨로 로그가 기록


** 참고: 로그레벨
1. DEBUG (the least serious)
2. INFO
3. WARN
4. ERROR
5. FATAL (the most serious)


JAVA 클래스에서 사용예
--------------------------------------------------------------------------------
public class Tester {
  private Logger logger = Logger.getLogger(Tester.class);
  ...

  public void logIt() {
    logger.info("im info log");
    logger.debug("im debug log");
  }
  ...
}
--------------------------------------------------------------------------------


JSP 클래스에서 사용예
--------------------------------------------------------------------------------
org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(this.getClass());

logger.info("im info log");
logger.debug("im debug log");
--------------------------------------------------------------------------------


2011년 8월 10일 수요일

JAVA and SQLite


아래를 클릭해서 jar 파일을 다운로드 한다.
http://files.zentus.com/sqlitejdbc/sqlitejdbc-v056.jar

JAVA 클래스패스에 다운로드 jar 파일을 추가한다.
이클립스 환경이라면 Build Path에 추가하던지 Dynamic Web Project라면 WEB-INF/lib에 파일을 복사

테스트 클래스를 만들고 아래 코드를 추가한 다음 실행!
이클립스 환경이라면 F11 누르고 Java Application 실행

*참고 http://www.zentus.com/sqlitejdbc/usage.html


import java.sql.*;

public class Test {
  public static void main(String[] args) throws Exception {
    Class.forName("org.sqlite.JDBC");
    Connection conn =
      DriverManager.getConnection("jdbc:sqlite:test.db");
    Statement stat = conn.createStatement();
    stat.executeUpdate("drop table if exists people;");
    stat.executeUpdate("create table people (name, occupation);");
    PreparedStatement prep = conn.prepareStatement(
      "insert into people values (?, ?);");

    prep.setString(1, "Gandhi");
    prep.setString(2, "politics");
    prep.addBatch();
    prep.setString(1, "Turing");
    prep.setString(2, "computers");
    prep.addBatch();
    prep.setString(1, "Wittgenstein");
    prep.setString(2, "smartypants");
    prep.addBatch();

    conn.setAutoCommit(false);
    prep.executeBatch();
    conn.setAutoCommit(true);

    ResultSet rs = stat.executeQuery("select * from people;");
    while (rs.next()) {
      System.out.println("name = " + rs.getString("name"));
      System.out.println("job = " + rs.getString("occupation"));
    }
    rs.close();
    conn.close();
  }
}


2011년 8월 8일 월요일

[android] Hello World tutorial



1. 안드로이드 프로젝트 생성
이클립스에서 "File > New > Project" 선택

New_Project__001.png 
Android Project를 선택하고 Next

New_Android_Project__002.png 
아래와 같이 내용을 입력하고 Finish 클릭
Project name: HelloAndroid
Application name: Hello, Android
Package name: com.example.helloandroid
Create Activity: MainAndroid
Min SDK Version: 10

HelloAndroid > src > com.example.helloandroid 에서 MainActivity 파일을 열고 아래와 같이 변경
  1. package com.example.helloandroid;

  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.widget.TextView;

  5. public class MainActivity extends Activity {
  6.     /** Called when the activity is first created. */
  7.     @Override
  8.     public void onCreate(Bundle savedInstanceState) {
  9.         super.onCreate(savedInstanceState);
  10.         setContentView(R.layout.main);
  11.         
  12. TextView tv = new TextView(this);
  13. tv.setText("Hello, Android");
  14. setContentView(tv);
  15.     }
  16. }

Run > Run 을 선택하거나 F11 버튼을 눌러 실행

Run_As__003.png 
Run as 화면에서 Android Application을 선택

ma_004.png
AVD가 구동되면서 위에서 작성한 application이 실행되는 화면을 볼 수 있다.
(시스템 사양이 않좋은 경우 매우매우 오래 걸릴 수 있음)