레이블이 gae인 게시물을 표시합니다. 모든 게시물 표시
레이블이 gae인 게시물을 표시합니다. 모든 게시물 표시

2010년 12월 28일 화요일

google app engine 쿼리 예제코드

http://stackoverflow.com/questions/2679759/update-query-in-google-app-engine-data-store-java


package gaej.example.contact.server;
 
import gaej.example.contact.client.Contact;
 
import java.util.List;
 
import javax.jdo.JDOHelper; import javax.jdo.PersistenceManager; import javax.jdo.PersistenceManagerFactory;
 
public class ContactJdoDAO implements ContactDAO {
   
private static final PersistenceManagerFactory pmfInstance = JDOHelper
           
.getPersistenceManagerFactory("transactions-optional");

   
public static PersistenceManagerFactory getPersistenceManagerFactory() {
       
return pmfInstance;
   
}

   
public void addContact(Contact contact) {
       
PersistenceManager pm = getPersistenceManagerFactory()
               
.getPersistenceManager();
       
try {
            pm
.makePersistent(contact);
       
} finally {
            pm
.close();
       
}
   
}

   
@SuppressWarnings("unchecked")
   
public List<Contact> listContacts() {
       
PersistenceManager pm = getPersistenceManagerFactory()
               
.getPersistenceManager();
       
String query = "select from " + Contact.class.getName();
       
return (List<Contact>) pm.newQuery(query).execute();
   
}

   
public void removeContact(Contact contact) {
       
PersistenceManager pm = getPersistenceManagerFactory()
               
.getPersistenceManager();
       
try {
            pm
.currentTransaction().begin();

           
// We don't have a reference to the selected Product.
           
// So we have to look it up first,
            contact
= pm.getObjectById(Contact.class, contact.getId());
            pm
.deletePersistent(contact);

            pm
.currentTransaction().commit();
       
} catch (Exception ex) {
            pm
.currentTransaction().rollback();
           
throw new RuntimeException(ex);
       
} finally {
            pm
.close();
       
}
   
}

   
public void updateContact(Contact contact) {
       
PersistenceManager pm = getPersistenceManagerFactory()
               
.getPersistenceManager();
       
String name = contact.getName();
       
String phone = contact.getPhone();
       
String email = contact.getEmail();

       
try {
            pm
.currentTransaction().begin();
           
// We don't have a reference to the selected Product.
           
// So we have to look it up first,
            contact
= pm.getObjectById(Contact.class, contact.getId());
            contact
.setName(name);
            contact
.setPhone(phone);
            contact
.setEmail(email);
            pm
.makePersistent(contact);
            pm
.currentTransaction().commit();
       
} catch (Exception ex) {
            pm
.currentTransaction().rollback();
           
throw new RuntimeException(ex);
       
} finally {
            pm
.close();
       
}
   
}
 
} 

2010년 11월 3일 수요일

구글앱스엔진 비지니스모델 출시!

Google Apps Engine 에 App Engine for Business 라는 메뉴가 신설 되었다
어플리케이션당 8달러.. ssl 을 지원한다는 내용이 눈에 들어온다.

http://code.google.com/intl/ko-KR/appengine/business/

ssl은 아이폰에 push하는 서비스를 만들때 지원되어야 하는 서버의 기능이다.
java로 인증서를 태워 push하는 샘플이 기존에는 돌아 가지 않았는데
이제 가능! 

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월 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

2010년 6월 28일 월요일

구글 앱스 엔진 Xstream 라이브러리 사용

구글 앱스 엔진에서
클래스를 XML로 생성해주는 자바 라이브러리 Xstream을 사용 하는데
서블릿을 구동 해보면 로컬에서는 문제가 없으나 디플로이후 웹에서 확인하면

sun.reflect.ReflectionFactory is a restricted class 라는 에러발생
사용이 불가한 클래스를 사용한 듯 하다.

다행히 외국인 노동자가 올린 문의 글을 찾았다. 


Xstream 라이브러리
http://xstream.codehaus.org/

해결 포럼
http://groups.google.com/group/google-appengine-java/msg/4dbd899817f98078

Gae용으로 다듬은 jar파일을 사용
http://www.google.com/url?sa=D&q=http://cloudcms.sheelapps.com/vfs/download/xstream-gae.jar&usg=AFQjCNGfPqZ34oXkUqMy08y9gzAAkA13_A

2010년 6월 27일 일요일

구글 앱스 엔진에서 Blobstore 서비스 제공

blob은 바이너리를 DB에 저장할때 정의 되는 자료형이다.(링크 참고)
http://www.terms.co.kr/BLOB.htm

구글 앱스 엔진에서 Blobstore가 제공되고 바이너리를 업로드 하면 DB에 저장이 된다.
제한 용량은 2기가!
http://code.google.com/intl/ko-KR/appengine/docs/java/blobstore/overview.html

2010년 6월 18일 금요일

Google apps engine 패키지, 커스텀 클래스 관련

앱스엔진 개발중 커스텀 클래스로 개발시 문제 정리 (계속 업뎃)
테스트로 발견한 특징으로 추측임을 밝힘!

1. client , server, shared 패키지가 자동으로 생성됨
    shared 패키지에 커스텀 클래스는 import 불가 ㅡㅡ;;

2. entry point 로 설정된 클래스에서 다른 클래스를 임포트 할 경우
    프로젝트명.gwt.xml 에 inherits설정

3. shared 패키지에 생성한 클래스는 entry point 클래스에서 임포트 가능(설정없이)

4. java.net.* 패키지가 임포트가 안됨
    java.util.* 은 임포트가 문제없이 됨으로 보아 특정 자바 패키지 사용시 별도의 설정이
    필요 한듯해 삽질 중...

   4번 문제는 GWT 가 원인
    gwt 는 자바 코드로 UI컴포넌트를 생성,사용 하지만 컴파일시에 
    모두 js로 변경하는 작업을 거침 (gwt는 js컴포넌트 라는게 중요)
    
    이때! js로 치환이 불가한 클래스가 포함 되었있을 경우 컴파일 불가
    일반 서블릿은 뷰로 변환 되지 않기 때문에 해당사항 없음!
    사용 가능 패키지 설명서 http://code.google.com/intl/sv-SE/webtoolkit/doc/1.6/RefJreEmulation.html

     url 호출을 위한 gwt 사용법
     http://code.google.com/intl/ko-KR/webtoolkit/doc/1.6/DevGuideServerCommunication.html#DevGuideRemoteProcedureCalls
    

2010년 6월 14일 월요일

GWT 와 GWT-Ext 구글 apps engine 에 적용하기

구글에서 제공하는 앱스 앤진과, GWT(자바로 js 컴포넌트를 활용하게 하는 컴포넌트 킷)
Gwt-Ext(GWT 에 기능과 디자인 강화)를 활용하면
몇가지 설정많으로 풍부한 컴포넌트를 사용해서 웹 어플리케이션을 개발가능

본인의 앱스 엔진에 올린 샘플 : http://vityaz7270.appspot.com/GwtExt_Test.html

컴포넌트 갤러리
http://www.smartclient.com/smartgwt/showcase/
Gwt, Gwt-Ext , Ext js 소개
http://docs.google.com/leaf?id=0B7qeLIkdVdMwMTQ3NjliYTQtMjQ0MS00NjA2LWFmYTUtZWNhODg5YTVjMTQ0&hl=ko

Gwt-Ext 웹사이트 > smartGwt로 개발진행
http://gwt-ext.com/
http://code.google.com/p/smartgwt/ 

설치방법
http://nya.springnote.com/pages/3416437

Gwt-Ext 와 Extjs의 Ext GWT관계!
GWT-EXT 는 extjs 를 Wrapping
Ext GWT 는 extjs 팀이 GWT 기반으로 재개발
참고

http://enzine.tistory.com/entry/GWT-Ext-%EC%95%BC-Ext-GWT%EC%95%BC
스프링 프레임웍 적용하는 예제
http://mudchobo.tomeii.com/tt/470