'개발'에 해당되는 글 188건

  1. 2014.05.09 Tomcat Context Reloader
  2. 2013.11.15 Background gradient
  3. 2013.07.19 [안드로이드] 디컴파일 되지 않는 시스템어플 디컴파일 하기
  4. 2013.05.25 Android Native Heap Size
  5. 2013.02.25 MySQL 백업 및 복구
  6. 2012.11.08 특정프로세서 죽이는 스크립트 [출처] 특정프로세서 죽이는 스크립트|작성자 Nams
  7. 2012.11.01 애자일 선언
  8. 2012.10.30 Maven Integration for Eclipse
  9. 2012.10.30 ArtifactDescriptorException: Failed to read artifact descriptor for xxx
  10. 2012.09.06 crontab 사용법
2014. 5. 9. 11:34

Tomcat Context Reloader




Tomcat의 컨텍스트를 reloadable=“false”인 상태에서, Tomcat Manager를 설치하지 않은 상태에서 수동 Reload 할 수 있는 Valve를 만들어 보았다. Reload Tomcat Context manually(without manager or reloadable=“true” option).

설정

  • Tomcat Reload Valve 소스와 Jar 파일에서 tomcatreloadvalve.jar 파일을 $CATALINA_HOME/lib 로 복사한다.
  • server.xml 혹은 context.xml의 <Context> 항목에 Valve를 추가한다. 항상 <Context> 항목에만 추가해야 한다.
    <Context docBase="some" path="/some" reloadable="false" >
        <Valve className="kr.pe.kwonnam.tomcat.reloader.TomcatReloadValve"/>
    </Context>
  • reloadable=“false”로 둔다. 원래 이 Valve의 목적은 자동 Reloading을 끄고, 항상 수동으로 원하는 경우에만 Reloading하는 것이다.

실행

  • 웹브라우저 혹은 wget 등으로 http://localhost:8080/reloadContext 를 호출한다.
  • 실제 URL의 도메인네임 부분은 자신의 톰캣 설정을 따른다.
  • “Context Reloaded!!” 메시지가 나오면서 Reloading이 완료된다.

소스

package kr.pe.kwonnam.tomcat.reloader;
 
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
 
import org.apache.catalina.Container;
import org.apache.catalina.Context;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.valves.ValveBase;
 
/**
 * Reload Tomcat Context by requesting URL
 *
 * Context의 reloadable="false"인 상태에서도 /reloadContext URL을 호출하면 해당 컨텍스트가 Reloading 된다.
 *
 * @author 손권남 kwon37xi@gmail.com
 *
 */
public class TomcatReloadValve extends ValveBase {
 
	private static final String RELOAD_CONTEXT_URI = "/reloadContext";
 
	@Override
	public void invoke(Request request, Response response) throws IOException,
			ServletException {
 
		Container container = getContainer();
 
		String requestUri = request.getRequestURI();
 
		String reloadUri = request.getContextPath() + RELOAD_CONTEXT_URI;
 
		if (requestUri.startsWith(reloadUri)
				&& container instanceof Context) {
			reloadContext(response, container);
			return;
		}
 
		getNext().invoke(request, response);
	}
 
	private void reloadContext(Response response, Container container)
			throws IOException {
		((Context) container).reload();
		HttpServletResponse httpResponse = response.getResponse();
 
		httpResponse.setContentType("text/plain;charset=utf-8");
		httpResponse.getWriter().write("Context Reloaded!!");
		httpResponse.getWriter().close();
 
		return;
	}
 
}

 

http://kwonnam.pe.kr/wiki/java/tomcat/contextreload


2013. 11. 15. 10:50

Background gradient




Create a Layout with a Drawable Gradient background and inside that your real layout.

For example, create mygrandientbg_xml in drawables dir like:

<shape android:shape="rectangle" xmlns...">
 <gradient
     android:startColor="#255779"
     android:centerColor="#3e7492"
     android:endColor="#a6c0cd"
     android:angle="90" />
</shape>

Then create a FrameLayout like that

<FrameLayout
  ....
  android:background="@drawable/mygrandientbg"
  android:padding=20dip
 >
 put you layout here and set it to "centered"


2013. 7. 19. 14:53

[안드로이드] 디컴파일 되지 않는 시스템어플 디컴파일 하기




※ 이강좌는 혼자 연구하면서 알게 되는 과정을 차근차근 재구성한겁니다..



(아무도 안알려주고...우씽...)



이번 강좌는 순정 시스템 apk파일을 디컴파일 할때 에러가 나면서 디컴파일 되지 않는

파일을 디컴파일 하는 방법을 알려드리겠습니다.

먼저 준비물이 필요합니다.

* Java SE Development Kit 6u21

* apk manager

* framework-res.apk 파일

* twframework-res.apk 파일

* phone.apk 파일 (강좌를 보며 따라할수있는 디컴파일 되지 않는 apk파일)

- Java SE Development Kit와 apk manager가 없으신분은 http://toforyou.tistory.com/55 이곳에서 받으시기 바랍니다.

테마를 제작하시거나 개발자분이시라면 시스템어플들을 한번씩은 디컴파일 시도해보신 경험이 있으실겁니다.

하지만 일부 apk파일은 오류가 나면서 디컴파일이 되지 않습니다.

대표적인 예로 phone.apk파일이나 Contacts.apk, Settings.apk 등이 있는데요

이 강좌를 보시면 디컴파일이 되지 않아 압축풀고 이미지만 바꿔야 했던거와는 달리

세부적인 수정도 가능해질겁니다.

예제로 보기 위해서 일단 phone.apk파일을 디컴파일 시도해봅시다.

먼저 apk manager 파일을 압축푸시고 준비물인 phone.apk 파일을

apk manager 안에 place-apk-here-for-modding폴더에 넣고

Script.bat 실행합니다.



먼저 22번을 눌러서 phone.apk파일을 선택해야합니다.


phone.apk파일이 선택되셨으면

9번을 눌러서 디컴파일 해줍니다.





그럼 디컴파일이 되다가 다음과 같이 에러가 납니다.

Can't find framework resources for package of id: 2. You must install proper framework files, see project website for more info.
"An Error Occured, Please Check The Log (option 21)"

대충 해석해보면  프레임워크 리소스 파일에서 2번대의 id를 찾을수 없다는 말을 합니다.

아까 apk manager를 압축풀었던 폴더에 가보시면 log.txt 파일이 생성되어있습니다.

이유를 알기 위해 log.txt 파일을 분석해봐야합니다.

모든 안되는 이유는 이 log.txt파일에 나와있거든요




#############################################################################################################

-------------------------------------------------------------------------- 
|2011-02-17 --  0:24:42.38| 
-------------------------------------------------------------------------- 
java version "1.6.0_23"
Java(TM) SE Runtime Environment (build 1.6.0_23-b05)
Java HotSpot(TM) Client VM (build 19.0-b09, mixed mode, sharing)
'adb'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는
배치 파일이 아닙니다.
C:\apk\place-apk-here-for-modding\../place-apk-here-for-modding/signedPhone.apk을(를) 찾을 수 없습니다.
C:\apk\place-apk-here-for-modding\../place-apk-here-for-modding/unsignedPhone.apk을(를) 찾을 수 없습니다.
1. I: Loading resource table...
W: Skipping "android" package group
 I: Decoding resources...
2. I: Loading resource table from file: C:\Users\Blue\apktool\framework\1.apk
3. W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x0207000d
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x0207000d
W: Could not decode attr value, using undecoded value instead: ns=android, name=textColor, value=0x0205009a
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x0207000f
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x0207000d
W: Could not decode attr value, using undecoded value instead: ns=android, name=textColor, value=0x0205009a
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x0207000d
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x0207000d
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x0207000e
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x0207000f


#############################################################################################################



다음과 같이 나와있습니다.

1. 번에서는 resource 테이블을 로딩한다고 나와있습니다.

resource 파일 뭔지 기억하시나요??

제가 http://toforyou.tistory.com/55 이강좌에서 설명드렸습니다. resources.arsc이파일은 모든 ID의 집합체라구요

2. 번을 보시면 C:\Users\Blue\apktool\framework\1.apk 파일에서 resources.arsc를 불러 온다고 합니다.
(이 폴더는 컴퓨터마다 다릅니다. 꼭 log.txt에서 자신의 폴더를 확인하세요)


3 번을 보시면 그 리소스에서 0x0207000d id를 찾을수 없다는 말을 합니다.

여기서

평소에 framework파일과 twframework파일에서 public.xml파일을 유심히 보셨다면 알수있는게 있습니다.

    <public type="attr" name="theme" id="0x01010000" />
    <public type="attr" name="label" id="0x01010001" />
    <public type="attr" name="icon" id="0x01010002" />
    <public type="attr" name="name" id="0x01010003" />
    <public type="attr" name="manageSpaceActivity" id="0x01010004" />
    <public type="attr" name="allowClearUserData" id="0x01010005" />
    <public type="attr" name="permission" id="0x01010006" />
    <public type="attr" name="readPermission" id="0x01010007" />
    <public type="attr" name="writePermission" id="0x01010008" />
    <public type="attr" name="protectionLevel" id="0x01010009" />
    <public type="attr" name="permissionGroup" id="0x0101000a" />
    <public type="attr" name="sharedUserId" id="0x0101000b" />

이 위에 나와있는것이 framework파일의 public.xml의 일부분 입니다.

여기서 공통점을 찾으셨나요?

모두 id가 0x01******로 시작한다는겁니다.

그럼 twframework 파일의 public.xml파일을 살펴보겠습니다.

    <public type="attr" name="twTabWidgetStyle" id="0x02010000" />
    <public type="attr" name="twRadioButtonStyle" id="0x02010001" />
    <public type="attr" name="twAlertDialogStyle" id="0x02010002" />
    <public type="attr" name="twSoftkeyItemStyle" id="0x02010003" />
    <public type="attr" name="twColorPickerStyle" id="0x02010004" />
    <public type="attr" name="twProgressBarStyle" id="0x02010005" />
    <public type="attr" name="twSeekBarStyle" id="0x02010006" />
    <public type="attr" name="fullDark" id="0x02010007" />
    <public type="attr" name="topDark" id="0x02010008" />
    <public type="attr" name="centerDark" id="0x02010009" />
    <public type="attr" name="bottomDark" id="0x0201000a" />
    <public type="attr" name="fullBright" id="0x0201000b" />

이런식으로 id가 모두 0x02******으로 시작합니다.

여기서 알수있듯이 

W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x0207000d
W: Could not decode attr value, using undecoded value instead: ns=android, name=textColor, value=0x0205009a
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x0207000f
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x0207000d
W: Could not decode attr value, using undecoded value instead: ns=android, name=textColor, value=0x0205009a
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x0207000d
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x0207000d
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x0207000e
W: Could not decode attr value, using undecoded value instead: ns=android, name=textAppearance, value=0x0207000f

이 에러들은 모두 twframwork-res에 사용되는 id값을 필요로 하고있었습니다.

왜 phone.apk파일을 디컴파일하는데 twframwork파일의 id값들을 요구를 할까요?

그건 phone.apk파일을 만들때 저 id들이 사용되었는데 디컴파일하면서 저 아이디 값이 무엇인지 알려고 하는거고 그 과정에서 

id값들을 찾기 못하기에 내는 에러입니다.

C:\Users\Blue\apktool\framework\1.apk

그럼 아까 2번 에러에서 나왔던 폴더를 들어가보면



1.apk 파일이 덩그러니 놓여있습니다.

열어보면 리소스 파일이 들어있습니다.

이 1.apk파일은 우리가 이런 어플들을 디컴파일 시도할때 생깁니다. 

지워도 자동으로 다시 생기구요

그리고 몇가지를 시도한끝에 몇가지를 알수있었습니다.

저 1.apk파일안에 들어있는 리소스 파일은

framework-res에 쓰이는 리소스 파일이라는겁니다. 즉 0x01******번대의 id정보가 담겨있다는겁니다.

그럼 삭제할때마다 나타나는 1.apk파일은 어디서 튀어나오는걸까요?

그건 apk manager폴더 안에 other폴더에 있는 apktool.jar에 답이 있습니다.



다시 android-framework.jar 을 열어보면


1.apk파일에 쓰였던 리소스 파일이 들어있습니다.

즉 여기에 framework-res파일의 리소스가 있었기에

phone.apk를 디컴파일할때 0x01*****번대의 id를 못찾는 다는 에러는 나오지 않는것입니다.

하지만 이 1.apk파일에 들어있는 리소스는 우리가(제가) 사용하는 삼성 프레임워크와는 좀 다릅니다.

저 리소스 파일이 어떤 핸드폰의 리소스 파일인지는 모르지만

id값이 약간 다르기때문에 0x01******번대의 에러도 가끔 나타납니다.

여기서 한가지 중요한사실은

framework와 twframework로 나누어져있는 삼성 갤럭시의 시스템입니다.

다른 제조회사의 경우 나눠져있는경우도 있고 다 framework에 들어있는 경우도 있거든요

그렇다면 phone.apk파일을 디컴파일 해주기 위해서는 2번대의 id를 인식해줄수 있게 twframework-res.apk의

리소스를 인식할수 있게 해줘야 합니다.

먼저 C:\Users\Blue\apktool\framework\ (사용자마다 이폴더는 다릅니다)

폴더에 있는 1.apk파일을 삭제해주시고

그 폴더에 framework-res.apk파일과 twframework-res.apk파일을 복사해주세요
(자신의 사용하는 기종의 펌웨어 버전 것을 복사하세요. 다른 기종걸 넣고 징징거리지 마세요)
(이걸 응용한다면 다른 회사핸드폰의 시스템어플도 디컴파일하는게 가능합니다. 요구하는게 몇번 id대의 파일인지만 조사하면요)



그리고 1번대의 id를 가지는 framework-res.apk파일은 1.apk파일로 변환해주시고

2번대의 id를 가지는 twframework-res.apk파일은 2.apk파일로 변환을 해줍니다.

그리고 다시 apk manager로 돌아와 phone.apk파일을 디컴파일 해봅니다.



에러없이 디컴파일이 완료되었습니다.

사실 1.apk파일과 2.apk파일 안에는 리소스 파일만 남기고 전부 싹다 지워도 상관없습니다.

디컴파일할때 필요한건 리소스 파일뿐이거든요

하지만 귀찮아서 그냥 원본 갔다가 붙여놓는겁니다.

평소에 디컴파일 안되던 파일들도 디컴파일이 다 잘되실겁니다.

이로써 강좌 끝.

출처 : http://toforyou.tistory.com/66

2013. 5. 25. 11:23

Android Native Heap Size




Androi


2013. 2. 25. 09:51

MySQL 백업 및 복구




MySQL 백업 및 복구

- MySQL 디렉토리 전체를 압축 백업하기
mysql dir : /var/lib (데이터베이스 디렉토리)
[root@byungun lib]# tar cvfpz mysql_dir_tar.gz /var/lib/mysql

- 특정 데이터베이스 백업과 복구
백업 형식 : mysqldump -u DB계정명 -p DB명 > 저장할파일명
복구 형식 : mysql -u DB계정명 -p DB명 < 저장할파일명

# mysql DB 백업
[root@byungun DB_backup]# mysqldump -u root -p mysql > mysqldb.sql
Enter password:

# mysql DB 생성
[root@byungun DB_backup]# mysqladmin -u root -p create mysql
Enter password:

# mysql DB 복구
[root@byungun DB_backup]# mysql -u root -p mysql < mysqldb.sql
Enter password:

- 특정 데이터베이스의 특정 테이블 백업과 복구
백업 형식 : mysqldump -u DB계정명 -p DB명 Table명 > 저장할파일명
복구 형식 : mysql -u DB계정명 -p DB명 < 저장할파일명

# mysql DB Table 백업
[root@byungun DB_backup]# mysqldump -u root -p testdb testtable > testtable_table.sql
Enter password:

# mysql DB Table 복구
[root@byungun DB_backup]# mysql -u root -p testdb < testtable_table.sql
Enter password:

- 여러 개의 데이터베이스 한 번에 백업과 복구
백업 형식 : mysqldump -u DB계정명 -p --databases [옵션] DB1 DB2 DB3  > 저장할파일명
복구 형식 : mysql -u DB계정명 -p < 저장할파일명

# mysql 여러 개의 DB 백업
[root@byungun DB_backup]# mysqldump -u root -p --databases tempdb testdb > various_db.sql
Enter password:

# mysql DB 복구
[root@byungun DB_backup]# mysql -u root -p < various_db.sql
Enter password:

- MySQL 전체 데이터베이스 백업과 복구
백업 형식 : mysqldump -u DB계정명 -p --all-databases > 저장할파일명
복구 형식 : mysql -u DB계정명 -p < 저장할파일명

[root@byungun DB_backup]# mysql -u root -p --all-databases > mysql_alldb.sql
Enter password:


2012. 11. 8. 10:53

특정프로세서 죽이는 스크립트 [출처] 특정프로세서 죽이는 스크립트|작성자 Nams




test 프로세스 모두 죽이기 제1안
  # kill -9 `ps -ef | grep test | awk '{print $2}'`

test 프로세스 모두 죽이기 제2안
  # ps -ef | grep test | grep -v grep | awk '{print "kill -9",$2}' | sh -v

test 프로세스 모두 죽이기 제3안
  # killall -KILL test

test 프로세스 모두 죽이기 쉘 스크립트 
  #!/bin/sh
  for PID `ps -ef | grep test | grep -v grep | awk '{print $2}'`
  do
  kill -9 $PID
  done

test User로 실행 되어지는 모든 프로세스 죽이기
  # kill -9 `ps -ef | awk '$1=="test" {print $2}'`

2012. 11. 1. 11:10

애자일 선언




애자일 선언을 위키백과와 애자일 선언 홈페이지의 내용을 참고하여 번역해 올립니다.

http://en.wikipedia.org/wiki/Agile_Manifesto
http://agilemanifesto.org/

---------------

애자일 선언은 애자일 소프트웨어 개발의 토대를 강화하는 원칙을 발표한 것이다. 초안은 2001년 2월 11일에서 13일까지 유타의 워새치산맥에 있는 스노우버드 스키 리조트 라운지에서 만들어졌다. 여기에서 기존의 무거운 방법론보다 가벼운 대체방법론들의 필요성에 대해 토의하고자 Extreme Programming, Scrum, DSDM, AdaptiveSoftware Development, Crystal, Feature Driven Development, Pragmaticprogramming 같은 다양한 새 방법론의 대표자들이 만났다.

---------------

Manifesto for Agile Software Development
애자일 소프트웨어 개발에 대한 선언


We are uncovering better ways of developing software by doing it and helping others do it.
우리는 소프트웨어를 개발하는 더 나은 방법을, 직접 실천하고 다른 이들을 도우면서 밝혀내고 있다.

Through this work we have come to value:
이 작업을 하는 동안 우리는 다음을 가치있게 여기게 되었다.

    Individuals and interactions over processes and tools 
    프로세스나 도구에 앞서 개인과 상호 작용을 
    Working software over comprehensive documentation
    포괄적인 문서화에 앞서 작동하는 소프트웨어를

    Customer collaboration over contract negotiation
    계약 협상에 앞서 고객과의 협력을 

    Responding to change over following a plan
    계획 준수에 앞서 변화에 대한 대응을

That is, while there is value in the items on the right, we value the items on the left more.
우리는 왼쪽 항목의 가치를 인정하면서도 오른쪽 항목을 더 중요하게 여긴다.

Kent Beck, Mike Beedle, Arie van Bennekum,
Alistair Cockburn, Ward Cunningham, Martin Fowler,
James Grenning, Jim Highsmith, Andrew Hunt,
Ron Jeffries, Jon Kern, Brian Marick,
Robert C. Martin, Steve Mellor, Ken Schwaber,
Jeff Sutherland, Dave Thomas


-----------------------------------------------------------------------------------
Principles behind the Agile Manifesto
애자일 선언의 배경 원칙들


We follow these principles:
우리는 다음 원칙들을 따른다:

Our highest priority is to satisfy the customer through early and continuous delivery of valuable software.
가치있는 소프트웨어를 조기에 그리고 지속적으로 인도해 고객을 만족시키는 것을 가장 우선으로 여긴다.

Welcome changing requirements, even late in development. Agile processes harness change for the customer's competitive advantage.
개발 후반이라고 해도 요구사항의 변경을 환영한다. 애자일 프로세스는 변경을 고객의 경쟁적 우위 요인으로 삼는다.

Deliver working software frequently, from a couple of weeks to a couple of months, with a preference to the shorter timescale.
작동하는 소프트웨어를 수 주에서 수 개월의 주기로 자주, 가능한 더 짧은 기간에 인도한다.

Business people and developers must work together daily throughout the project.
프로젝트 기간 내내 업무 전문가와 개발자가 매일 함께 일해야 한다. 

Build projects around motivated individuals. Give them the environment and support they need, and trust them to get the job done.
동기부여된 개인을 중심으로 프로젝트를 구축하라. 그들에게 필요한 환경과 지원을 제공하고 업무를 완수할 것으로 믿어라.

The most efficient and effective method of conveying information to and within a development team is face-to-face conversation.
개발팀에게 그리고 팀 내에서 
정보를 전파하는 가장 효율적이고도 효과적인 방법은 얼굴을 직접 보고 대화하는 것이다.

Working software is the primary measure of progress. 
작동하는 소프트웨어가 진도를 측정하는 제 1 척도이다.

Agile processes promote sustainable development. The sponsors, developers, and users should be able to maintain a constant pace indefinitely. 
애자일 프로세스는 지속할 수 있는 개발을 장려한다. 후원자들과 개발자들과 사용자들은 일정한 보폭을 끝까지 유지할 수 있어야 한다.

Continuous attention to technical excellence and good design enhances agility.
기술적 탁월함과 좋은 설계에 대한 끊임없는 관심은 기민성을 강화한다.

Simplicity--the art of maximizing the amount of work not done--is essential.
단순함, 안 해도 되는 일은 최대한 안 하게 하는 기교, 이것이 핵심이다. 

The best architectures, requirements, and designs emerge from self-organizing teams.
최고의 아키텍쳐와 요구사항과 설계는 자기 조직화된 팀에서 나온다.

At regular intervals, the team reflects on how to become more effective, then tunes and adjusts its behavior accordingly.
팀은 정기적으로 더 효과적으로 일할 수 있는 방법을 숙고하고 그에 따라 자신의 행동을 조율하고 수정한다.

2012. 10. 30. 13:42

Maven Integration for Eclipse




메이븐을 이용해서 웹프로젝트는 사용할 수 있도록 해보겠습니다.

아직까지도 불편하기만 하지만.. 쩝..

http://eclipse.org/m2e/



Eclipse Indigo(3.7)와 JDK 1.6 으로 설치 해보겠습니다.


아래 두개의 사이트에서 업데이르를 받습니다.

Maven Integration for Eclipse Update Site : http://m2eclipse.sonatype.org/sites/m2e/

Maven Integration for Eclipse Extras Update Site : http://m2eclipse.sonatype.org/sites/m2e-extras/



Maven Intergration for Eclipse WTP 플러그인이 웹 어플을 만들 수 있게 해주는 플러그인 입니다.



플러그인이 둘 다 설치되면 이클립스를 재시작 합니다.

이제 이클립스에서 메이븐 프로젝트를 생성할 수 있습니다.




위와 같은 경고 메세지가 보이면 eclipse.ini 파일에 jdk 위치를 직접 지정합니다.

(경로는 각자 다르니 알아서.. -_-+)

  1. -startup
  2. plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar
  3. --launcher.library
  4. plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.100.v20110502
  5. -product
  6. org.eclipse.epp.package.jee.product
  7. -vm
  8. C:\Program Files\Java\jdk1.6.0_27\bin\javaw.exe
  9. --launcher.defaultAction
  10. openFile
  11. --launcher.XXMaxPermSize
  12. 256M
  13. -showsplash
  14. org.eclipse.platform
  15. --launcher.XXMaxPermSize
  16. 256m
  17. --launcher.defaultAction
  18. openFile
  19. -vmargs
  20. -Dosgi.requiredJavaVersion=1.5
  21. -Xms40m
  22. -Xmx512m


이제 웹프로젝트를 만들어서 테스트 해봅시다~

File - New - Other... (Ctrl + N)

Maven Porject 를 선택합니다.


그냥 Next 클릭.



"maven-archetype-webapp" Archetype 을 선택합니다.



Group Id 와 Artifact Id(프로젝트명)를  적습니다.



아래와 같이 프로젝트가 만들어졌습니다.



평소 이클립스에서 하듯이 서버에 배치하고 실행해보면 페이지가 나오는 것을 확인할 수 있습니다.




JDK 버전 맞추기

그나마 우리가 쓰던대로 하려면 아주 조금 더 설정을 해줘야합니다. -_-;;;

만약 JDK 1.6 이상을 쓴다면 아래와 같이 경고가 나는 것을 확인할 수 있습니다.

Description Resource Path Location Type
Build path specifies execution environment J2SE-1.5. There are no JREs installed in the workspace that are strictly compatible with this environment.  first-maven  Build path JRE System Library Problem


메이븐 프로젝트는 기본적으로 Java 1.5를 사용하게 설정되어 있네요.

프로젝트에서 마우스 오른쪽 버튼 클릭 - Properties (Alt + Enter) 선택해서 프로젝트 설정으로 들어갑니다.

Java 를 1.6 으로 변경합니다.





Project Explorer 정렬 문제

프로젝트 생성 후에 작업을 하다보면 웹 파일쪽의 뭔가 이상합니다. -_-;;

폴더 a-z , 파일 a-z 였던 정렬이 뒤엉켜 버립니다. ㅠ_ㅠ


그나마 쓸 수 있는 방법은 아래와 같습니다.

Project Explorer 오른쪽의 View Menu(아래쪽 세모)를 클릭 - Customize View 선택.


JavaScript Elements, Web Resources, Resources 를 체크 해제합니다.


이제는 제대로 보이네요 ㅎㅎ




Java Resource 설정

이제 자바 파일을 생성해 보겠습니다.

근데 이상하게 나옵니다 -_-;; 그냥 파일로 인식이 되네요...


수정해봅시다. ㅠㅠ

프로젝트 설정으로 갑니다.

Java Build Path 부분에서 Source 탭으로 이동합니다.

기존에 있던 폴더를 삭제 후 다시 폴더를 추가합니다.


src/main/reources 를 선택합니다.



OK 버튼을 클릭합니다.


이제야 제대로 보이네요 ㅎㅎㅎ




메이븐을 사용하는 가장 큰 이유인 pom.xml 을 이용한 라이브러리 자동 세팅(?)을 이용하기 m2eclipse 플러그인을 설치했습니다.

한발치 떨어져서 보면 열라 좋아 보이지만 막상 쓸려고하니까 기존 Dynamic Web Project 에 익숙해져서 인지 불편하네요..

그나마 두번째 플러그인(WTP를 위한 플러그인)이 없었을 때는 더 불편했었죠... ㅠㅠ

설치 후에 버그(?)들 쉽게 해결할 수 있는 방법 아시는분~

2012. 10. 30. 13:40

ArtifactDescriptorException: Failed to read artifact descriptor for xxx




aven 프로젝트 체크아웃 시 다음과 같은 에러에 직면할 수 있다.

ArtifactDescriptorException: Failed to read artifact descriptor for org.apache.commons:com.springsource.org.apache.commons.logging:jar:1.1.1: ArtifactResolutionException: Failure to transfer org.apache.commons:com.springsource.org.apache.commons.logging:pom:1.1.1 from http://repository.springsource.com/maven/bundles/release was cached in the local repository, resolution will not be reattempted until the update interval of com.springsource.repository.bundles.release has elapsed or updates are forced. Original error: Could not transfer artifact org.apache.commons:com.springsource.org.apache.commons.logging:pom:1.1.1 from/to com.springsource.repository.bundles.release (http://repository.springsource.com/maven/bundles/release): No route to host to http://repository.springsource.com/maven/bundles/release/org/apache/commons/com.springsource.org.apache.commons.logging/1.1.1/com.springsource.org.apache.commons.logging-1.1.1.pom    pom.xml    /spring.test    line 1    Maven Dependency Problem

이 경우 다음과 같이 한다.

Maven -> Update Dependencies

다음을 체크하고, OK 버튼을 클릭한다.

Force Update of Snapshots/Releases

혹시 왜 이런 문제가 발생하는지 아시는 분이 있다면,

코멘트 부탁드립니다 :-)

2012. 9. 6. 09:45

crontab 사용법




# crontab -l       현재사용하고 있는 crontab 파일 출력
# crontab -e       crontab 파일의 수정(edit)

crontab -e 로 수정이 안될경우
1. #csh        2. #setenv EDITOR vi 명령 수행후 수정함
root crontab file

/etc/cron.d/logchecker 
  : /var/cron/log가 최대 화일 크기를 초과하는지를 판단하고, 만약
    초과하면 내용을 /var/cron/olog로 복사한다. 
/usr/lib/newslog 
  : syslog daemon에 의해서 /var/adm 디렉토리에 생성되는 log file을 청소한다.

Controlling crontab Access 
cron utility를 제어하는 두개의 file 
/etc/cron.d/cron.allow 
/etc/cron.d/cron.deny

User Access 
- cron.allow file이 존재하면, 그 file에 적혀있는 user만이 
crontab 명령어를 사용할 수있다. 
- 이 file이 없으면 crontab은 cron.deny file을 체크해서 user가 crontab 실행을 금지할 지를 결정한다. 
- 만약 둘다 없으면 crontab은 root만 실행시킬 수 있다. 
cf) daemon, bin, smtp, nuucp, listen, nobody, noaccess file은 crontab 사용할 수 없다. 
- cron.allow file은 user가 만들어 주어야한다. 
- crontab 명령어는 crontab file을 수정, 삭제, 편집할 수있다. 
- crontab 명령어는 user에대한 입력을 /var/ spool/cron/crontabs/username에 저장한다. 
- root 만이 다른 user의 crontab file을 읽고 편집할 수있다. 
- root의 crontab file은 /var/spool/cron/crontab/root 이다.


crontab file format

# cd /var/spool/cron/crontabs 에 가신후
   # more root
   10 3 * * 0,4 /etc/cron.d/logchecker
   10 3 * * 0   /usr/lib/newsyslog
   15 3 * * 0 /usr/lib/fs/nfs/nfsfind
   1 2 * * * [ -x /usr/sbin/rtc ] && /usr/sbin/rtc -c > /dev/null 2>&1
   ----------   ========================
   1 2 3 4 5           program

   1 : minute (0-59),
   2 : hour (0-23),
   3 : day of the month (1-31),
   4 : month of the year (1-12),
   5 : day of the week (0-6 with 0=Sunday).

   이렇게 되고 실행할 파일명을 program 부분에 적어 주면 된다.

   파일을 맞게 변경후 cron 데몬을 리스타트시키면 된다.
   아니면..리부팅

   예로
   * * 1 * * /usr/local/program     

   이렇게 한다면 한달에 한번 매월 1일에만 program 을 실행.

   지금 root 파일을 변경했는데 root 파일이 아닌 각계정의 파일을 만들어 사용하면 각유저마다 자동으로 실행할수 있다.     
 
 
///////////////////////////////////////////////////////////////////////////////////////
 
  
crontab 옵션
crontab [ -u user ] file 
crontab [ -u user ] { -l | -r | -e } 
-u user : user 사용자에 대해서 crontab 작업을 수행한다. 생략하면 crontab 명령을 실행하는 사용자에 대해서 crtontab 작업을 수행.
-l : 현재 cron table을 보여 줌
-r : 현재 cron table을 삭제
-e : 현재 cron table을 편집
일반적으로  crontab -e 명령을 주로 사용한다.

crontab 사용 권한 : /etc/cron.allow, /etc/cron.deny 
특정 사용자에게만 cron의 사용을 허가할 경우
/etc/cron.allow 파일에 허가할 사용자만 추가해준다 
/etc/cron.deny 파일에 허가하지 않을 사용자를 추가한다
/etc/cron.allow를 먼저 참조한다. 
/etc/cron.allow에 명시된 사용자는 cron job을 실행할 수 있다.
/etc/cron.allow에 없는 사용자는, /etc/cron.deny에도 없다면, cron job을 실행할 수 있다.
/etc/cron.allow, /etc/cron.deny 두 파일이 존재하지 않으면 슈퍼 유저만 cron job을 수행할 수 있다.
/etc/cron.deny 파일이 존재하고 아무 내용 없이 비어 있다면, 모든 사용자가 cron job을 수행할 수 있다.

cron table의 각 필드
+-------------------------------------------------------------------+
| 분 | 시간 | 날짜 | 달 | 요일 | 사용자 | 명령 |
+-------------------------------------------------------------------+
minute(0~59) hour(0-23) day(1-31) month(1-12) weekday(1-7) command 
<분>은 0-59  <시>는 0-23  <날짜>는 0-31  <달>은 0-12(0또는 12는 12월, 1은 1월...) <요일>은 0-7(0과 7은 일요일, 1은 월요일...)
''*''  :  everytime
''-''  :  범위 지정, 예를 들어 시간 필드에 1-3이면 1시와 3시 사이
'',''  :  separator, 예를 들어 시간 필드에 1,3이면 1시와 3시
/   :  시간필드 에서 23-7/2라면 23시부터 07시까지 매 2시간마다라는 의미
      분필드에서 */2라면 매 2분마다라고 해석하면 된다.

사용 예
30  05 *  *  1    ~/bin/backup.sh
              ==> 매주 월요일  오전 05시 30분에 ~/bin/backup.sh을 실행
30  2  1  *  *    ~/bin/backup.sh
              ==> 매월 1일 새벽 2시 30분에 ~/bin/backup.sh를 실행
20  1  *  *  *    find /tmp -atime +3 -exec rm -f () '';''
              ==> 매일 새벽 01시 20분에 3일간 접근하지 않은 /tmp내의 파일을 삭제