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이 실행되는 화면을 볼 수 있다.
(시스템 사양이 않좋은 경우 매우매우 오래 걸릴 수 있음)

[android] 개발환경 구축 (Install the SDK)


Installing the SDK

Step 1. 요구사항

1. 시스템 요구사항

(1) 지원 운영체제
- 윈도 XP(32-bit) Vista(32 or 64 bit) Windows7 (32 or 64bit)
- Mac OS X 10.5.8 or later (x86 only)
- Linux (tested on Ubuntu Linux, Lucid Lynx)
GNU C Library (glibc) 2.7 이상
우분투의 경우 8.04 이상
64-bit 배포판의 경우 32비트 어플리케이션 호환 가능해야 함
(http://developer.android.com/sdk/installing.html#troubleshooting)

(2) 지원되는 개발환경
- Eclipse 3.5 (Galileo) 이상
- Eclipse JDT(Java development tools) 플러그인
- JDK 5 or 6 (JRE는 불가)
- Android Development Tools plugin (recommended)

2. eclipse 다운로드
Eclipse Class 버전 권장, 아니라면 Java 또는 RCP 버전을 권장함


Step 2. SDK 패키지 다운로드
아래 경로에서 환경에 맞는 Android SDK를 다운로드 받는다.
다운받은 파일이 설치파일 (exe 등) 이면 해당 파일을 실행해서 설치하고
, 압축파일(zip 또는 tgz)이면 원하는 디렉토리 (C:\android-sdk-<machine-platform> 또는 /usr/local/ android-sdk-<machine-platform>) 압축 해제한다.
뒤에 SDK설치 경로를 사용하니 위의 경로를 기억해둔다.


Step 3. 이클립스에 ADT 플러그인 설치

1. ADT 플러그인 다운로드
이클립스에서 Help > Install New Software.... 선택
Install__002.png 
우상단의 Add 버튼 클릭
Add_Repository__003.png 
Add Repository 창이 나타나면 이름에 "ADT Plugin" URL에 "https://dl-ssl.google.com/android/eclipse/" 을 입력하고 "OK" 클릭
Install__004.png 
다운로드에 문제가 있다면 https 대신 http 사용한다.
이후 설치할 소프트웨어를 선택하고 설치한다.
설치가 완료되면 이클립스를 재시작 한다.  
2. ADT 플러그인 설정
"Window > Preferences..." 메뉴를 선택 (맥에선 "Eclipse > Preferences")
왼쪽 패널에서 Android 선택
Preferences__006.png 
위에서 설치한 Android SDK 경로를 지정
Apply 버튼 클릭


Step 4. 플랫폼 추가 및 다른 구성요소 설치
이클립스에서 "Window > Android SDK and AVD Manager"
Android_SDK_and_AVD_Manager__007.png 
"Available packages"에서 설치하고자 하는 패키지를  선택하고 "Install selected" 클릭
Choose_Packages_to_Install__008.png 
"Android Repository" 에 있는 내용 설명
- SDK Tools: 안드로이드 어플리케이션 개발시 디버깅 및 테스팅할 수 있는 툴 (<sdk>/tools/ 에 설치됨)
- SDK Platform-tools:  안드로이드 어플리케이션 개발을 위한 platform-dependent 툴 (<sdk>/platform-tools/에 설치됨)
- Android platforms: 설치가능한 안드로이드 SDK 플랫폼
- USB Driver for Windows (Windows only)
- Samples: 샘플 어플리케이션 
- Documentation: 안드로이드 프레임워크 API 문서

* 개발을 위한 필수선택사항
SDK Tools (이미 설치됨)
SDK Platform-tools
적어도 하나 이상의 Android platforms
USB Driver for Windows (MS Windows를 쓰는 경우)


Step 5. Create ad AVD
이클립스에서 "Window >Android SDK and AVD Manager " 선택

Virtual Devices 탭을 선택하고 New 버튼 클릭
Name: my_avd
Target: 원하는 프레임워크 버전
SD Card: Size: 64MiB
Skin: Built-in: Default
Create_new_Android_Virtual_Device_(AVD)__009.png