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
대상 데이터 형식입니다. xml, bigint 및 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");
--------------------------------------------------------------------------------