2010년 7월 18일 일요일

mac eclipse svn(subversion) 비밀번호 초기화

구글 프로젝트 호스팅(http://code.google.com/hosting/)에서 플젝 관리를 하는데
관리자 정보 변경후 이클립스 svn 커밋이 403 Error만 주구장창 뿌려대서 
기저장된 아이디와 비번을 바꾸려고 시도를 했는데 쉽지않다....

검색결과 윈도우에서는 아래링크에 해결 방법이있다.
http://commerceguy.wordpress.com/2008/08/27/change-subclipse-svn-authentication-and-certificate/


C:\Documents and Settings\{User}\Application Data\Subversion
위 디렉토리로 가면 svn.simple 이란 디렉토리 안에 암호화 된듯한 문자열 이름의
파일이 몇개 있다.문서도구로 열어보면 저장된 계정들에 대한 정보가 텍스트로 저장이
되어있어 변경하고 싶은 계정의 파일만 삭제후 이클립스 재실행 후 svn 커밋시도시
아이디 비번을 다시 묻는창이 뜬다!

그럼 나같은 Mac유저는 어디서 저 폴더를 찾을 수 있는가!
사용자폴더에 .subversion 디렉토리(숨김폴더)에서 찾을수 있었는데
같은방법을 적용해도 해결되지가 않는다

.eclipse-keyring 이라는 파일을 삭제 해야된다.


개발 코드보다 환경을 잡는게 더 어렵다 ㅠㅠ

2010년 7월 12일 월요일

quercus로 java 에서 php를 사용하자! 구글 앱스 엔진 (gae)에서도!

이전에 아이폰 푸쉬를 php로 구현 해서 서버에 셋팅해두고 사용하고 있었는데
http://devityaz.blogspot.com/2010/05/apns-provider-php.html
자바에서는 SSLSocket으로 가능하나 두벌 작업이 귀찮은데... 라고 생각하다
자바에서 php를 구동 하는 방법을 찾아서 정리한다.

자바에서 Quercus 프레임웍을 이용해서 php를 사용할 수가 있다.

http://www.caucho.com/resin-3.1/doc/quercus.xtp

http://www.caucho.com/에서 jar파일을 다운로드 받아
맹글어둔 아이폰 푸쉬 php파일을 구동해보았는데 깔끔하게 돌아간다!
(구글 앱스엔진에서는 안됨)

Quercus 프레임워크 설명

http://www.ibm.com/developerworks/kr/library/wa-quercus/

구글앱스엔진에 적용
http://www.webdigi.co.uk/blog/2009/run-php-on-the-google-app-engine/

2010년 7월 11일 일요일

웹서버 에러 코드 (Error code)

출처:잘모름

100 : Continue
101 : Switching protocols
200 : OK, 에러없이 전송 성공
201 : Created, POST 명령 실행 및 성공
202 : Accepted, 서버가 클라이언트 명령을 받음
203 : Non-authoritative information, 서버가 클라이언트 요구 중 일부 만 전송
204 : No content, 클라언트 요구을 처리했으나 전송할 데이터가 없음
205 : Reset content
206 : Partial content
300 : Multiple choices, 최근에 옮겨진 데이터를 요청
301 : Moved permanently, 요구한 데이터를 변경된 임시 URL에서 찾았음
302 : Moved temporarily, 요구한 데이터가 변경된 URL에 있음을 명시
303 : See other, 요구한 데이터를 변경하지 않았기 때문에 문제가 있음
304 : Not modified
305 : Use proxy
400 : Bad request, 클라이언트의 잘못된 요청으로 처리할 수 없음
401 : Unauthorized, 클라이언트의 인증 실패
402 : Payment required, 예약됨
403 : Forbidden, 접근이 거부된 문서를 요청함
404 : Not found, 문서를 찾을 수 없음
405 : Method not allowed, 리소스를 허용안함
406 : Not acceptable, 허용할 수 없음
407 : Proxy authentication required, 프록시 인증 필요
408 : Request timeout, 요청시간이 지남
409 : Conflict
410 : Gone, 영구적으로 사용할 수 없음
411 : Length required
412 : Precondition failed, 전체조건 실패
413 : Request entity too large,
414 : Request-URI too long, URL이 너무 김
415 : Unsupported media type
500 : Internal server error, 내부서버 오류(잘못된 스크립트 실행시)
501 : Not implemented, 클라이언트에서 서버가 수행할 수 없는 행동을 요구함
502 : Bad gateway, 서버의 과부하 상태
503 : Service unavailable, 외부 서비스가 죽었거나 현재 멈춤 상태
504 : Gateway timeout
505 : HTTP version not supported

2010년 7월 9일 금요일

구글 앱스엔진 제한 패키지, 라이브러리

(제한 클래스에 대한 공식문서를 발견하지 못해 제한 사항 발생할때마다
해당 포스트에 추가!~)

XML파싱을 위해 XStream 라이브러리를 사용하다 사용제한 클래스 때문에
문제가 있었던 적이있었다
해당글 > http://devityaz.blogspot.com/2010/06/xstream.html
 또 다른 케이스 발생

html문서 파싱을 위해 HTMLEditorKit.ParserCallback를 사용했는데 아래와 같은 오류
javax.swing.text.html.HTMLEditorKit$Parser is a restricted class. Please see the Google App Engine developer's guide for more details


해결 방법 못찾음

java char -> string 변환

html을 파싱하면서 콜백으로 전달되는 Char형 데이터를
문자열로 변환을 아래처럼 해결 했다.

!한가지 Character생성자에서 char데이터를 할당하는데
클래스 내부에 this.char 를 지정하는 메소드가 따로 없어서
아래처럼 for문 도는동안 매번 새로 생성을 해야했다.

public void handleText(char[] data, int pos)
{
  Character cr = null;
  String title = "";
              
   for(int i=0; i< data.length ; i++){
         cr = new Character(data[i]);
         title += cr.toString();
   }
}

관련링크
http://littletrue.egloos.com/3994862
http://www.roseindia.net/java/java-conversion/CharToString.shtml

[링크]Java Html 파싱

java에서 html페이지의 특정 태그들을 파싱

관련 라이브러리 
http://decoder.tistory.com/41

swing 패키지를 사용해서 처리
http://kimgisa.net/tag/%EC%9B%B9%ED%8E%98%EC%9D%B4%EC%A7%80%20%ED%8C%8C%EC%8B%B1#recentTrackback

2010년 7월 7일 수요일

AIR HTML DOM객체에 이벤트 생성, 패치(발생)하기

AIR의 HTML컴포넌트에서 html객체에 이벤트 디스패치가 아래와 같이 가능하다.

//dom객체 일단 object에 할당
var gloginBtn:Object = html.htmlLoader.window.document.getElementById("signIn");
//도큐먼트에 이벤트 생성
var gClickEvent:Object = html.htmlLoader.window.document.createEvent("MouseEvents");
//클릭 이벤트 등록
gClickEvent.initMouseEvent("click",true,true);

//이벤트 발생       
gloginBtn.dispatchEvent(gClickEvent);

자바스크립트 이벤트 관련 링크
https://developer.mozilla.org/ko/DOM/event
http://www.quirksmode.org/js/events_mouse.html
http://www.elated.com/articles/events-and-event-handlers/

AIR Html Iframe Dom 접근

AIR의 HTML컴포넌트는 아래와 같이 렌더링된 html객체에 접근이 가능하다
html.htmlLoader.window.document.getElementById("아이디").value = "입력값";

그런데 IFrame안의 Dom에는 접근이 어려워 아래와 같은 포럼을 발견했다.
http://forums.adobe.com/message/2528520

contentWindow에 접근해서 해결이 가능하다.
html.htmlLoader.window.document.getElementById("iframeID").contentWindow.document.getElementById("아이디").value = "입력값";

참고링크
http://help.adobe.com/ko_KR/AIR/1.5/devappsflash/WS5b3ccc516d4fbf351e63e3d118666ade46-7eb2.html

IMAP Fetch 명령어로 메일 읽어올때 옵션(안읽은 메일로 표시 유지)

imap 프로토콜 명령어중 메일을 읽어드리는 Fetch 명령어가 있다.

120번 메일을 읽어올때 아래와 같이 처리하는데
BODY(읽음)와 BODY.PEEK(안읽음)는 읽어드린 메일의 읽음 상태를 설정한다.
FETCH 120 (FLAGS BODY.PEEK[HEADER.FIELDS (DATE FROM SUBJECT)])

이렇게도 처리는 가능 하지만 서버에서 반환되는 데이터 값의 포맷은 위와 다르게 전달 된다.
120  FETCH 120 all


                       
                           

2010년 7월 5일 월요일

IMAP 관련 링크

IMAP은 메일서버와 통신하는 프로토콜(smtp, pop)로
구글, 다음, 네이버등이 지원하고 있습니다.

IMAP 은 서버의 메일들을 삭제하지 않음
검색,로드,삭제,편지함 생성삭제 등이 가능함

관련링크 

메시지 프로토콜, imap에 대한 설명 
http://qaos.com/sections.php?op=viewarticle&artid=209

프로토콜 사용예제
http://www.imapwiki.org/ClientImplementation

프로토콜 사용예제(한글)
http://www.i-swear.com/318

2010년 7월 2일 금요일

Java 에서 XML 파싱( SAX 이용 )





기록차원에서 쓰는거라 반말 양해 바랍니다 ~ 

배경
영화 평점 보는게 귀찮아서 만든 아이폰 어플인 movietrip은 사용자의 조회 데이터를
구글 앱스 엔진의 DB에 저장한다.

다양한 사람들이 검색한 영화를 저장만 하자니 아까워서 RSS로 뽑고 AIR로 뷰어를 
만들었는데 나만 쓰는거 같아 영화 추천용 트위터 계정 생성~



앱스엔진의 cron을 사용하여 평점이 좋은 영화를 정기적으로 

포스팅 하면 팔로우하는 사람들이 좋은 영화 추천받고 뭐 그럴것 같아 공부겸 만들기 
시작 했는데 영화 상세정보 페이지 주소 140자 오바!

bit.ly의 주소줄이기 api로 해결점 획득(http://bit.ly/a/your_api_key)

그런데 자바의 XML파싱에서 어려움...
결국 성공은 했으나 기록에 필요성이 있어 간단히 정리.

필요한 jar 다운로드 
http://www.jdom.org/dist/binary/

코드설명
파일스트림으로 xml을 로드할 수도, 외부 URL을 입력하여 xml파싱 할 수 있다.
(외부url 파싱하는걸로 코드 작성)

어려운 부분은 파싱처리에 대한 핸들러 설정이었다
굵게 표시한 부분  

String url = "http://api.bit.ly/v3/shorten?login=fe7270&apiKey=키입력&longUrl=http://twitter.com/movietrip&format=xml";
        
        XMLReader parser = new SAXParser();
        XmlParseHandler xmlHandler = new XmlParseHandler();

parser.setContentHandler(xmlHandler);
//parser.setErrorHandler(xmlErrorHandler);
        
try {
parser.parse(url);
} catch (SAXException e) {
e.printStackTrace();
}

XmlParseHandler 는 ContentHandler를 인터페이스로 확장해서 생성한다.
그러면 구현해야할 함수들이 주르륵 생성이 되는데 

각 메소드들에 대한 설명은 아래 참고링크를 확인 

//파싱된 값들이 아래로 전달 된다. tempValue라는 변수에 값을 기억해두고 
public void characters(char[] ch, int start, int length)throws SAXException {
tempValue = new String(ch,start,length);
}

//엘리먼트가 하나하나 처리될때 마다 호출되는 이 함수로 사용하고픈 qName이 왔을때
//가져다 쓴다.
public void endElement(String uri, String localName, String qName)throws SAXException 
{
     if(qName.equalsIgnoreCase("url")) 
    {
             //url 값은 tempValue에 담겨 있을것!
     }
}

XML의 속성에 접근하기 위해서는 startElement 메소드를 조작 하면 된다.

xml 파싱 참고링크 
http://java.sun.com/developer/Books/xmljava/ch03.pdf
http://techblog.textcube.com/154
http://blog.bagesoft.com/727