2013년 11월 22일 금요일

ubuntu tomcat 기본설치 후 실행 노트

출처: http://stackoverflow.com/questions/10259738/how-to-restart-tomcat-6-in-ubuntu

/etc/init.d/tomcat7 start
/etc/init.d/tomcat7 stop
/etc/init.d/tomcat7 restart
우분투에 apt-get install tomcat7 으로 설치한 톰캣을 실행.

출처: http://askubuntu.com/questions/135824/what-is-the-tomcat-installation-directory

apt-get으로 설치한 후 폴더 구조이다.
/etc/tomcat6/
├── Catalina
│   └── localhost
│       ├── ROOT.xml
│       └── solr.xml -> ../../../solr/solr-tomcat.xml
├── catalina.properties
├── context.xml
├── logging.properties
├── policy.d
│   ├── 01system.policy
│   ├── 02debian.policy
│   ├── 03catalina.policy
│   ├── 04webapps.policy
│   ├── 05solr.policy -> /etc/solr/tomcat.policy
│   └── 50local.policy
├── server.xml
├── tomcat-users.xml
└── web.xml
/usr/share/tomcat6
/usr/share/tomcat6
├── bin
│   ├── bootstrap.jar
│   ├── catalina.sh
│   ├── catalina-tasks.xml
│   ├── digest.sh
│   ├── setclasspath.sh
│   ├── shutdown.sh
│   ├── startup.sh
│   ├── tomcat-juli.jar -> ../../java/tomcat-juli.jar
│   ├── tool-wrapper.sh
│   └── version.sh
├── defaults.md5sum
├── defaults.template
└── lib
    ├── annotations-api.jar -> ../../java/annotations-api-6.0.35.jar
    ├── catalina-ant.jar -> ../../java/catalina-ant-6.0.35.jar
    ├── catalina-ha.jar -> ../../java/catalina-ha-6.0.35.jar
    ├── catalina.jar -> ../../java/catalina-6.0.35.jar
    ├── catalina-tribes.jar -> ../../java/catalina-tribes-6.0.35.jar
    ├── commons-dbcp.jar -> ../../java/commons-dbcp.jar
    ├── commons-pool.jar -> ../../java/commons-pool.jar
    ├── el-api.jar -> ../../java/el-api-2.1.jar
    ├── jasper-el.jar -> ../../java/jasper-el-6.0.35.jar
    ├── jasper.jar -> ../../java/jasper-6.0.35.jar
    ├── jasper-jdt.jar -> ../../java/ecj.jar
    ├── jsp-api.jar -> ../../java/jsp-api-2.1.jar
    ├── servlet-api.jar -> ../../java/servlet-api-2.5.jar
    ├── tomcat-coyote.jar -> ../../java/tomcat-coyote-6.0.35.jar
    ├── tomcat-i18n-es.jar -> ../../java/tomcat-i18n-es-6.0.35.jar
    ├── tomcat-i18n-fr.jar -> ../../java/tomcat-i18n-fr-6.0.35.jar
    └── tomcat-i18n-ja.jar -> ../../java/tomcat-i18n-ja-6.0.35.jar
/usr/share/tomcat6-root/
/usr/share/tomcat6-root/
└── default_root
    ├── index.html
    └── META-INF
        └── context.xml
/usr/share/doc/tomcat6
/usr/share/doc/tomcat6
├── changelog.Debian.gz -> ../libtomcat6-java/changelog.Debian.gz
├── copyright
└── README.Debian.gz -> ../tomcat6-common/README.Debian.gz
/var/cache/tomcat6
/var/cache/tomcat6
├── Catalina
│   └── localhost
│       ├── _
│       └── solr
│           └── org
│               └── apache
│                   └── jsp
│                       ├── admin
│                       │   ├── form_jsp.class
│                       │   ├── form_jsp.java
│                       │   ├── get_002dproperties_jsp.class
│                       │   ├── get_002dproperties_jsp.java
│                       │   ├── index_jsp.class
│                       │   ├── index_jsp.java
│                       │   ├── schema_jsp.class
│                       │   ├── schema_jsp.java
│                       │   ├── stats_jsp.class
│                       │   ├── stats_jsp.java
│                       │   ├── threaddump_jsp.class
│                       │   └── threaddump_jsp.java
│                       ├── index_jsp.class
│                       └── index_jsp.java
└── catalina.policy
/var/lib/tomcat6
/var/lib/tomcat6
├── common
│   └── classes
├── conf -> /etc/tomcat6
├── logs -> ../../log/tomcat6
├── server
│   └── classes
├── shared
│   └── classes
├── webapps
│   └── ROOT
│       ├── index.html
│       └── META-INF
│           └── context.xml
└── work -> ../../cache/tomcat6
/var/log/tomcat6
/var/log/tomcat6
├── catalina.out
톰캣 외부 접속 설정
출처: http://asm0628.tistory.com/176
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" address="0.0.0.0" /> 

git hub 몇가지 노트

간단한 명령어 소개 링크 : http://unikys.tistory.com/323
-> 명령어를 잘 정리해 놓은 링크
내가 사용하는 몇가지 명령어 참조: http://chriskr7.blog.me/60203914580
1. 우선 깃헙에 리파지토리를 만든다.
2. 내 로컬에 git폴더를 만들고 리파지토리와 동일한 이름의 폴더를 만든다.
3. 커맨드 창에서 'git init' 명령어로 초기화 한다.
4. git remote add origin https://github.com..... 을 통해서 나의 리파지토리 url을 origin으로 설정
(git remote set-url origin https://UserID@github.com/UserID/repository.git 을 통해 변경가능)
5. git add . (or git commit -a) 명령어로 파일들을 더한다.
6. git commit 명령어로 커밋한다. (리눅스에서 커밋 코멘트를 다는 화면으로 이동한다)
7. git push -u origin master 명령어로 origin의 master 브랜치로 푸시한다.
8. git pull origin 명령어로 origin의 변경 내용을 내려받을 수 있다.


머지하기
출처: http://yaku.tistory.com/334
출처: http://gitref.org/branching/

git branch
-> 현재 브랜치를 확인한다.
git merge target
-> 타겟 브랜치를 현재 브랜치에 머지한다.
(git checkout -b change_class
Switched to a new branch 'change_class')
컨플릭트가 발생하면
git diff
-> 다른 항목들의 (컨플릭트가 발생한 항목) 내용을 확인 할 수 있다.
에디터로 해당 항목을 연 후
(git merge fix_readme
Auto-merging README
CONFLICT (content): Merge conflict in README
Automatic merge failed; fix conflicts and then commit the result.
$ cat README 
<<<<<<< HEAD
Many Hello World Examples
=======
Hello World Lang Examples
>>>>>>> fix_readme

This project has examples of hello world in 
nearly every programming language.)
>>>>>>>> 와 ======= 또는 <<<<<<<< 로 이루어진 항목을 찾아가서 해당 컨플릭트를 해결하면 된다. 현재까진 직접 중복 결과값을 수정해도 문제 없었다.
$ git status -s
UU README
$ git add README 
$ git status -s
M  README
$ git commit 
[master 8d585ea] Merge branch 'fix_readme'
위에 상태 확인을 했을 때 UU 항목이 컨플릭트 등에 의해서 머지가 제대로 안된 항목
컨플릭트를 해결한 후 add시키면 된다.
그 후에 커밋하면 끝.

Ignore 설정하기
출처: http://rapapa.net/?p=85
어느 소스폴더에서 "git init"를 한 폴더 전체가 소스관리 대상에 포함된다.
(git init 는 git로 현재폴더를 소스관리 하겠다는 명령어)
.git이 있는 최상위폴더 (git init을 한 폴더)에서
.gitignore 파일을 만든다
내용은 커밋을 제외하는 내용을 적으면 된다. (출처 참조)
글로빙 규칙에 맞춰서 적으면 된다.
이미 커밋이 되어 있던(사용중이던) 폴더라면
제외 시켜주면 되는데
출처에 나온 git rm 명령을 쓰면 된다.
제외 시킬 파일을 미리 확인하고 싶으면
git rm --dry-run *.log(제외시킬 파일 글로빙)
이렇게 하면 된다.

2013년 11월 19일 화요일

Facebook example을 사용하면서 생기는 에러 - Android

conversion to dalvik format failed unable to execute dex...
dex loader unable to execute dex buffer overflow....

-> 개인적으로 가장 이해가 안되는 에러였다. 이것저것 다 해봤지만 결국  버전의 다운그레이드가 정답이었다. 이 에러는 사람들마다 해결책이 다 다른것 같다.

unable to instantiate activity componentinfo

-> 전체적으로 페이스북 예제를 처음 만들어서 실행할 때 가장 큰 에러는 빌드 패스인것 같다.
출처2의 안드로이드 디펜던시를 제거했더니 실행이 된다는 내용은... 추천하지 않는다. 임시방편이고 단지 실행만 된다. 실제 런타임에서는 에러가 발생된다.

->  안드로이드 인증관련 문제인데... 해결책을 보면 볼수록 어렵다. 그냥 설치된 앱을 지우고 프로젝트 클린하고 재빌드해서 도전하는게 나을듯

가장 도움이 많이 되었던 링크 http://dakehosu.tistory.com/69
페이스북 SDK를 받아서 이클립스에서 라이브러리로 추가해야 한다는 내용이다.
가장 정확하고 도움이 많이 되었다.

실제 오랜시간 삽질을 하고 나니 대부분 빌드패스의 문제였다. 안드로이드 서포터 jar파일이 나의 프로젝트에도 있고 페이스북 SDK 프로젝트에도 있어서 생기는 문제가 가장 날 힘들게 했다. ㅠ

2013년 11월 18일 월요일

layout inflater

- 레이아웃 인플레이터(Layout Inflater)
: 레이아웃 인플레이터는 레이아웃 xml 파일에 상응하는 뷰 객체를 반환받는 데 사용한다. 자바 프로그램 코드상에서는 레이아웃 인플레이터에 직접 접근하지 못하고 getLayoutInflater() 메소드를 이용하거나 getSystemService(String) 메소드를 호출해 반환값으로 LayoutInflater 객체를 받아야 한다. 

2013년 10월 13일 일요일

AssertionError: write() argument must be string | 구글 앱 엔진

파이선으로 구글 앱 엔진 예제를 동작 시키던 중
위와 같은 에러가 생기면서 동작이 안되었다.

많은 내용들을 보니 유니코드로 바꾸면 된다는 결론
하지만 유니코드로 바꿀 때 안되는 부분이 있었다.
self.response.out.write(content.encode('utf-8'))
이 부분은 제대로 동작하지 않는듯 하다.
self.response.out.write(unicode(template.render('main.html', {})))
다시 찾다보니 위와 같이 바꾸니까 된다.

출처:
1. 동작안했던 유니코드 변환 부분
http://stackoverflow.com/questions/8558323/error-in-deployed-gae-requesthandler-using-webapp2
2. 동작하는 유니코드 변환부분
http://chrislee.kr/wp/tag/wsgirefhandlers-py-assertionerror-write-argument-must-be-string-python/

2013년 9월 25일 수요일

Android - display | getWidth(), getHeight()

Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();
윈도우 매니저의 getDefaultDisplay() 메소드를 통해 Display 객체를 얻은 후 이 객체의 getWidth(), getHeight() 함수를 사용해 현재 화면의 가로, 세로 해상도를 추출한 코드이다.
하지만 이 코드들은 deprecated 되었다.

다른 방법을 찾아서 노트로 남겨 놓는다.
Point pOutSize = new Point();
getWindowManager().getDefaultDisplay().getSize(pOutSize);
int width = pOutSize.x;
int height = pOutSize.y;

EditText et1 = (EditText)findViewById(R.id.et1);
et1.setWidth(width -100);


코드 출처: 노규남, Q&A로 배우는 안드로이드 프로그래밍, WellBook, Q36(330page)
내용 출처: http://sshioi.tistory.com/125, 안드로이드 The method getWidth() from the type Display is deprecated :: 프잡 파트

2013년 8월 27일 화요일

Spring Batch | Tasklet 옵션

Copied from : http://stackoverflow.com/questions/11119036/spring-batch-how-to-limit-the-no-of-executions-of-a-chunk

<batch:step id="mig-chain-data">
<batch:tasklet allow-start-if-complete="false" start-limit="1">
<batch:chunk commit-interval="1" reader="reader" writer="writer"></batch:chunk>
</batch:tasklet>
</batch:step>


 start-limit controls the number of times a Step may be started, not the chunk configured for this step.

From : http://www.codeproject.com/Articles/445856/Getting-Started-With-Spring-Batch-Part-Two

commit-interval 은 한번에 수행할 청크의 갯수를 지정 (processes 'N'  chunk at a time as indicated by the commit-interval)

Copied from : http://springsource.tistory.com/93
Tasklet
Tasklet 은 Step 내부의 트랜잭션 또는 반복될 수 있는 처리작업을 의미한다. 개발자들은 Tasklet 인터페이스를 직접 구현해서 사용하거나 스프링 배치가 제공하는 구현체를 사용할 수도 있다. 압축파일을 해제한다거나 특정 디렉토리를 정리하는 등의 특정 작업에는 직접 구현한 Tasklet 이 유용하다. 스프링 배치는 시스템 명령을 호출한다거나 chunk 기반(chunk-oriented) 처리를 수행할 수 있도록 좀더 일반화된 Tasklet 구현체를 제공한다. 
tasklet 엘리먼트가 제공하는 어트리뷰트는 다음과 같다.
ref : Tasklet 인터페이스를 구현한 스프링 빈의 id 를 의미한다. 커스텀 tasklet 을 사용하려면 이 어트리뷰트를 설정해 줘야 한다.
transaction-manager : Tasklet 에서 트랜젝션처리 시에 사용할 스프링 트랜젝션 매니저를 설정한다. tasklet 에서는 기본적으로 트랜잭션 처리가 가능하다. 디폴트 값은 transactionManager 이다.
allow-start-if-complete : Tasklet 의 실행이 성공했을 경우라도 스프링 배치가 이 Tasklet 을 재실행 가능한지 여부를 설정한다.

Reference : http://www.pfl-cepia.inra.fr/uploads/gdp_docs/spring-batch-2.0.pdf