프로젝트 정의

2017. 1. 6. 23:27

보호되어 있는 글입니다. 내용을 보시려면 비밀번호를 입력하세요.

Error generating final archive: Debug certificate expired on ...

이클립스에서 안드로이드 애플리케이션 빌드 중에 이런 오류 메시지가 나오는 경우가 있다.

Debug certificate가 만료되어서 발생하는 문제인데, Debug certificate는 만들어진 후 365일이 지나면 만료된다. 그러므로 만료된 Debug certificate를 새로 갱신해주면 된다. 방법은 간단하다. debug.keystore 파일을 삭제한 후, 그냥 다시 안드로이드 애플리케이션을 빌드만 하면 된다.

debug.keystore 파일의 위치는 'Window > Preferences > Android > Build'에서 'Default debug keystore' 항목을 참조하면 된다.


WRITTEN BY
정현석
이것저것 끄적끄적....

,
출처 : http://wearekorean.co.kr/zbxe/26101

브라우저와 웹서버와의 대화

브라우저는 웹서버에게 이미지, CSS 그리고 동적생성 정보(HTML, XML, JSON... 등 많은 컨텐츠를 요청합니다. 그런데 동일한 리소스(이하 컨텐츠)를 여러번 요청하는 경우가 굉장히 많습니다. 전형적인 예가 이미지나 CSS 같은 정적 컨텐츠인데 이런 것을 요청할 때 브라우저와 웹서버가 어떻게 대화하는지 아래 그림으로 살펴보겠습니다.


  • 1: /AAA 컨텐츠를 주세요
  • 2: OK 주었습니다. 이 컨텐츠의 마지막 갱신일은 2009년 9월 7일... 입니다. (컨텐츠 전송)
  • 잠시 후...
  • 3: /AAA 컨텐츠를 주세요. 아. 제가 캐시에 가지고 있는 건 마지막 갱신일이 2009년 9월 7일 ... 이네요
  • 4: 변경사항 없습니다. 그냥 캐시에 있는 것 쓰세요. (아무것도 전송 안함)
브라우저 기본설정이라면 캐시에 있을 경우 브라우저가 시작하고 한 번 확인하고 두 번 다시는 GET 확인 요청을 하지 않습니다. 그냥 캐시에 있는 걸 씁니다. 브라우저를 다시 시작할 경우만 확인 요청을 합니다. 서버에 아예 요청도 안 가니 네트워크나 서버 부하는 무지 감소합니다. (IE 인터넷 옵션 설정에서 "페이지를 열 때마다"로 설정된 경우는 매번 확인 요청을 합니다.)


동적 컨텐츠와 304

서블릿이나 JSP 등으로 생성하는 동적 컨텐츠는 매번 정보가 갱신되어야 하기에 이런 메커니즘을 사용하지 않습니다. 그런데 간혹 서버 컨텐츠 마지막 갱신일을 알고 매우 요청이 많은 페이지 일 경우 위 메커니즘을 이용하는 것도 좋은 방법이겠네요. 다음 예는 JSP로 구현한 소스 예입니다.

01 <%
02   // 서버 컨텐츠의 마지막 갱신을 얻어온다.
03   java.util.Date date = getLastModified();
04   long clientDate = request.getDateHeader("If-Modified-Since");
05   long serverDate = date.getTime();
06   if (clientDate != -1 && clientDate >= serverDate) {
07       response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
08       return;
09   }
10   response.setDateHeader("Last-Modified", serverDate);
11 %>

비즈니스 로직이 실행되기 전 해당 정보 갱신일을 살펴보고 다시 줄 것인지 304를 던질 것인지 판단하는게 좋겠습니다. 그래야 필요없는 서버 로직이 수행되지 않습니다.


웹 애플리케이션 성능 향상

기본에 충실하는게 좋습니다. 우선은 문제가 되는 비즈니스 로직을 충분히 튜닝하십시오. 그런 후 특별한 캐싱 장치를 사용하거나 가능하면 위의 경우처럼 표준 캐싱 메키니즘을 충분히 활용하십시오.

그리고 비즈니스 로직의 성능을 높이기 위해 특정 비즈니스 로직을 열심히 튜닝하기 전에 우선 Fiddler 같은 도구로 브라우저와 서버가 무슨 통신을 하는지 살펴보는게 좋습니다. 생각보다 필요없는 요청이 많이 발생할 수도 있습니다.


WRITTEN BY
정현석
이것저것 끄적끄적....

,
* Date 형식 String datePattern = "[\d+\-]+[\d+\-]+[\d]+";
* email 형식 검사하는 java regex 를 이용한 소스
package kr.pe.okjsp.util;
import java.util.regex.Pattern;
public class FormatEmail {
public static void main(String[] args) {
String [] mails = {"okjsp@okjsp.pe.kr",
"@okjsp.pe.kr",
"hello@kr",
"happ_okjsp.pe.kr"};

for(int i=0; i<mails.length; i++) {
System.out.println(mails[i] + " : " + isEmail(mails[i]));
} // end for
}

public static boolean isEmail(String email) {
if (email==null) return false;
boolean b = Pattern.matches(
"[\w\~\-\.]+@[\w\~\-]+(\.[\w\~\-]+)+",
email.trim());
return b;
}
}
import java.util.regex.*; // Pattern과 Matcher가 속한 패키지
class RegularEx5
{
public static void main(String[] args)
{
String source = "23123()asdawe()23123()asdawe()23123()asdawe()";
String pattern = "\d+\(\)"; // 숫자(\d)뒤에오는 괄호를 패턴으로 지정
// d는 숫자를 의미하며 +는 하나이상의 숫자가 있어야함을 의미
// 괄호는 예약문자(?)이므로 \를 앞에 붙여줘야 괄호로 인식
// 괄호앞에 \를 붙이지 않으면 그룹화문자로 인식한다.
// 를 \와 같이 두개씩 쓰는 이유는 문자열 내에서 를 표현하려면 두개 써줘야하기 때문
StringBuffer sb = new StringBuffer();
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(source);
System.out.println("source:"+source);
int i=0;
while(m.find()) {
// 지정한 패턴과 매칭되는 부분을 치환한다. 마지막 두글자인 괄호를 잘라내고
// 원하는 문자(@@)로 바꾼다.
// find()를 통해서 패턴과 일치하는 부분은 m.group()을 통해서 얻는다.
m.appendReplacement(sb, m.group().substring(0, m.group().length()-2)+"@@");
}
m.appendTail(sb);
System.out.println("result:"+sb.toString());
}
}
/*
source:23123()asdawe()23123()asdawe()23123()asdawe()
result:23123@@asdawe()23123@@asdawe()23123@@asdawe()
*/
숫자뒤에오는 ()를 @@로 바꾼겁니다.
[예제2] - 다양한 정규식활용예
import java.util.regex.*; // Pattern과 Matcher가 속한 패키지
class RegularEx2
{
public static void main(String[] args)
{
String[] data = {"bat", "baby", "bonus", "c", "cA",
"ca", "co", "c.", "c0", "c#",
"car","combat","count", "date", "disc"
};
String[] pattern = {".*","c[a-z]*","c[a-z]", "c[a-zA-Z]", "c[a-zA-Z0-9]",
"c.","c.*","c\.","c\w","c\d","c.*t", "[b|c].*",
".*a.*", ".*a.+", "[b|c].{2}"
};
for(int x=0; x < pattern.length; x++) {
Pattern p = Pattern.compile(pattern[x]);
System.out.print("Pattern : " + pattern[x] + " 결과: ");
for(int i=0; i < data.length; i++) {
Matcher m = p.matcher(data[i]);
if(m.matches())
System.out.print(data[i] + ",");
}
System.out.println();
}
} // public static void main(String[] args)
}
/*
Pattern : .* 결과: bat,baby,bonus,c,cA,ca,co,c.,c0,c#,car,combat,count,date,disc,
Pattern : c[a-z]* 결과: c,ca,co,car,combat,count,
Pattern : c[a-z] 결과: ca,co,
Pattern : c[a-zA-Z] 결과: cA,ca,co,
Pattern : c[a-zA-Z0-9] 결과: cA,ca,co,c0,
Pattern : c. 결과: cA,ca,co,c.,c0,c#,
Pattern : c.* 결과: c,cA,ca,co,c.,c0,c#,car,combat,count,
Pattern : c. 결과: c.,
Pattern : cw 결과: cA,ca,co,c0,
Pattern : cd 결과: c0,
Pattern : c.*t 결과: combat,count,
Pattern : [b|c].* 결과: bat,baby,bonus,c,cA,ca,co,c.,c0,c#,car,combat,count,
Pattern : .*a.* 결과: bat,baby,ca,car,combat,date,
Pattern : .*a.+ 결과: bat,baby,car,combat,date,
Pattern : [b|c].{2} 결과: bat,car,
*/
[참고]쌍따옴표(")내에서 escape문자()를 표현하려면 escape문자를 '\'와 같이 두 번 사용해야한다.
자주 쓰일 만한 몇 가지 패턴들을 만들어서 테스트하였다. 그 결과를 정리해보면 다음과 같다.
정규식
설명
결과

c[a-z]*
c로 시작하는 영단어
c,ca,co,car,combat,count,

c[a-z]
c로 시작하는 두 자리 영단어
ca,co,

c[a-zA-Z]
c로 시작하는 두 자리 영단어
(a~z 또는 A~Z, 즉 대소문자 구분안함)
cA,ca,co,

c[a-zA-Z0-9]
cw
c로 시작하고 숫자와 영어로 조합된 두 글자
cA,ca,co,c0,

.*
모든 문자열
bat,baby,bonus,c,cA,ca,co,c.,c0,c#,car,combat,count,date,disc,

c.
c로 시작하는 두 자리
cA,ca,co,c.,c0,c#,

c.*
c로 시작하는 모든 문자열(기호포함)
cA,ca,co,c.,c0,c#,car,combat,count,

c.
c.와 일치하는 문자열
'.'은 정규식표현에 사용되는 문자이므로 escape문자인 ''를 사용해야한다.
c.,

cd
c[0-9]
c와 숫자로 구성된 두 자리 문자열
c0,

c.*t
c로 시작하고 t로 끝나는 모든 문자열
combat,count,

[b|c].*
[bc].*
[b-c].*
b 또는 c로 시작하는 문자열
bat,baby,bonus,c,cA,ca,co,c.,c0,c#,car,combat,count,

[^b|c].*
[^bc].*
[^b-c].*
b 또는 c로 시작하지 않는 문자열
date,disc,

.*a.*
a를 포함하는 모든 문자열
* : 0 또는 그 이상의 문자
bat,baby,ca,car,combat,date,

.*a.+
a를 포함하는 모든 문자열.
+: 1 또는 그 이상의 문자
+는 *과는 달리 반드시 하나 이상의 문자가 있어야 하므로 a로 끝나는 단어는 포함되지 않았다.
bat,baby,car,combat,date,

[b|c].{2}
b 또는 c로 시작하는 세 자리 문자열.
(b 또는 c 다음에 두 자리이므로 모두 세 자리)
bat,car,

출처 : http://blog.empas.com/kulc78/18226644

WRITTEN BY
정현석
이것저것 끄적끄적....

,

WRITTEN BY
정현석
이것저것 끄적끄적....

,