다음과 같은 에러 메시지를 만나면 당황하게 됩니다.

  File "C:\Program Files\Google\google_appengine\google\appengine\tools\devappserver2\wsgi_server.py", line 31, in <module>

    from cherrypy import wsgiserver

  File "C:\Program Files\Google\google_appengine\lib\cherrypy\cherrypy\__init__.py", line 70, in <module>

    from cherrypy import _cptools

  File "C:\Program Files\Google\google_appengine\lib\cherrypy\cherrypy\_cptools.py", line 245, in <module>

    from cherrypy.lib import cptools, encoding, auth, static, jsontools

  File "C:\Program Files\Google\google_appengine\lib\cherrypy\cherrypy\lib\static.py", line 7, in <module>

    mimetypes.init()

  File "C:\Python27\lib\mimetypes.py", line 358, in init

    db.read_windows_registry()

  File "C:\Python27\lib\mimetypes.py", line 258, in read_windows_registry

    for subkeyname in enum_types(hkcr):

  File "C:\Python27\lib\mimetypes.py", line 249, in enum_types

    ctype = ctype.encode(default_encoding) # omit in 3.x!

UnicodeDecodeError: 'ascii' codec can't decode byte 0xb1 in position 9: ordinal not in range(128)



C:\Python27\Lib 폴더의 mimetypes.py 249번째 줄에서 발생한 에러입니다.


편집기로 열어서 지우거나 앞에 #을 붙여서 주석처리합니다.

끝!


추가로 메모장에서 한글을 사용하는 경우, 파일 > 다른 이름으로 저장 메뉴를 선택하고 인코딩을 UTF-8로 저장하는 것을 추천합니다.


안녕, World! 보기 쉽지 않네요.



관련 글: http://stackoverflow.com/questions/4237898/unicodedecodeerror-ascii-codec-cant-decode-byte-0xe0-in-position-0-ordinal/4238212#4238212



구글 앱엔진 시작하기 윈도우XP 편


구글 앱엔진 애플리케이션 업로드



윈도우에서 구글 앱 엔진을 돌려 봤습니다. 파이썬으로 작업을 하면서 삽질을 조금했기 때문에 기록을 남겨봅니다. 현재 구글앱엔진은 파이썬 2.7을 공식 지원합니다. python 3.x은 지원하지 않습니다. 때문에 python27을 다시 설치했습니다.(삽질1)


절차는 다음과 같습니다.

part 1 앱 엔진 등록

1.1 http://appengine.google.com/ 사이트에 구글 계정으로 등록을 합니다. 휴대폰인증이 있습니다.

1.2 앱엔진 애플리케이션을 만듭니다. Application Identifier(예, khcuweb)가 정해지면 http://khcuweb.appspot.com 로 접근하게 됩니다.


part 2 로컬 개발환경

2.1 구글앱엔진 SDK 파이썬 버전을 다운로드 받아서 설치합니다.

2.2 http://python.org 사이트에서 Python 2.7을 다운로드 받아서 설치합니다.

2.3 환경 변수 > 사용자 변수 Path에 C:\Program Files\Google\google_appengine\ 경로 추가된 것 확인

2.4 환경 변수 > 시스템 변수 Path에 C:\Python27;C:\Python27\Scripts; 경로를 추가합니다.


part 3

3.1 helloworld.py 만들기

3.2 app.yaml 만들기

3.3 dev_appserver.py helloworld.py 실행하기 

윈도우 XP에서 UnicodeDecodeError 발생하는데, 이에 관해서는 다음 글에 올리겠습니다.












구글의 앱 엔진(http://appengine.appspot.com/)은 데이터를 저장할 때 비용이 발생합니다. SQL을 사용하려면 더 비쌉니다.

간단히 데이터를 저장하고 빼는 방법으로 DataStore API를 제공해줍니다. 그리고, 저장된 데이터는 관리자 웹 페이지를 통해서 확인할 수 있습니다.


저장하는 절차는 다음과 같습니다.

1. 환경에서 DatastoreService를 가져옵니다.

2. Key를 만듭니다. Key의 종류와 key 이름을 추가합니다.

3. 레코드는 Entity 클래스를 이용합니다.

4. entity에 key : value 형식으로 기록할 데이터를 입력합니다.

5. Datastore에 entity를 추가합니다.


private static final String KEY_KIND = "Game";

private static final String keyName = "games";


DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();


public void save(Game game) {

Key entityKey = KeyFactory.createKey(KEY_KIND, keyName);


Entity entity = new Entity(KEY_KIND, entityKey);


User firstUser = game.getFirstUser();

User secondUser = game.getSecondUser();


entity.setProperty("first", firstUser.getName());

entity.setProperty("firstchoice", firstUser.getChoice());

entity.setProperty("second", secondUser.getName());

entity.setProperty("secondchoice", secondUser.getChoice());


entity.setProperty("datetime", new Date());

entity.setProperty("ip", game.getIp());


datastore.put(entity);

}



관리자 페이지에서는 다음과 같이 화면이 제공됩니다.




데이터를 꺼내오는 방법은 다음과 같습니다.


1. Key를 만듭니다.

2. Query를 만들면서 정렬순서와 기준 항목을 정합니다.

3. Datastore에서 Query를 이용해서 데이터를 꺼냅니다.

4. Entity 목록을 처리합니다.

public List<Entity> fetchAll() {

Key entityKey = KeyFactory.createKey(KEY_KINDkeyName);

Query query = new Query(KEY_KIND, entityKey).addSort("datetime",

Query.SortDirection.DESCENDING);

List<Entity> games = datastore.prepare(query).asList(

FetchOptions.Builder.withLimit(5));


return games;

}




구글맵을 하기 위해서 거쳐야 하는 apikey 작업이 바뀌었군요.

maps.jar도 Google Play Services 패키지 안에 포함되었구요. 

GCM(Google Cloud Messaging)도 [Deprecated] 딱지가 붙고, 이것도 Google Play Services로 포함되었습니다.

더 파고 들어가 봐야겠습니다.

일단 구글맵 v2 먼저 정리하신 분 블로그 링크겁니다.

http://pppdw.tistory.com/entry/GoogleMap-API-v2-띄워-볼까요



요즘 파이썬을 배우는 분들에게 추천해 봅니다. python2.5버전 기준의 개(GAE; Google App Engine)를 설명합니다만 300페이지 안되는 분량에서 제법 많은 것들을 다뤄줍니다. 웹 프레임워크는 Django(장고)를 사용합니다.


구글 앱 엔진에 파이썬으로 프로그래밍을 시작하는 분들에게 적합합니다. 그리고 웹 개발을 처음 배우시는 분들에게 HTML, CSS, JavaScript, jQuery까지 단계적으로 핵심을 알려줍니다. 초고속 과외라고 할 수 있습니다. 


구글 앱 엔진을 통해서 배우는 파이썬이라고 총평하고 싶네요.




http://www.appenginelearn.com/

원 저자 찰스 세프란스가 운영하는 페이지입니다. 강의 PDF와 책의 예제를 다운로드 받을 수 있습니다. 

번역도 무난하게 잘 되어 있습니다. 역자주도 개념을 잡는 데 도움을 줍니다.


http://okae-12-ajax.appspot.com/

ae-12-ajax.appspot.com 을 올려보았습니다. 

주의) 회원가입시 사용한 비번은 회원들에게 보여집니다. ^^;



삭제, 탈퇴는 관리자만 가능합니다.

http://appengine.google.com







일단 아이맥 완료했습니다.
대대적으로 일어납니다. 연락처, 사진, iTunes, 메일, 일정이 iCloud의 계정에 연결됩니다.


로그인을 하고 나면 연락처, 캘린더, 책갈피에 대해서 iCloud사용 옵션이 나옵니다. 나의 Mac찾기는 나의 아이폰 찾기와 같은 형식이겠지요.


구글의 연락처를 잘 쓰고 있었는데, 이제 격리됩니다. 안드로이드와 잘 연계하고 쓰고 있었는데, 많이 아쉬운 부분입니다.


맥의 위치를 볼 수 있고, 유실된 맥의 위치 찾거나 잠그고 내용을 지우도록 하는 기능입니다.

완료되었습니다.


이제 아이폰과 아이패드 업데이트 해야겠습니다.



이클립스 mylyn과
http://code.google.com/p/okjsp 연결을 위한 플러그인을 다룹니다.
plugin url: http://knittig.de/googlecode-mylyn-connector/update/


KDF 발표자료입니다.

넥서스원은 잘 쓰고 있습니다. 괜찮은 안드로이드폰이구요. 그런데 넥서스2라고 불리는 모델이 노출되었네요.
http://www.engadget.com/2010/11/11/this-is-the-nexus-s/ 
이미지의 키보드를 보니 SAMSUNG이라고 쓰여져 있는 것을 보면 국내에서 찍은 사진 같습니다.


카메라 옆에 플래시도 있는 것 같습니다. ^^; 따라쟁이 삼별

포장지에 있는 "넥서스2"라는 스티커도 그렇고, Google 인증마크도 인상적입니다.

한편 베스트바이 사이트에도 잠깐 노출이 되었었다고 합니다.
http://akarb-log.blogspot.com/2010/11/best-buy-mobile-ha-sbadatamente-svelato.html?spref=tw

트위터에 계속 관련글들이 올라옵니다. 오늘의 핫이슈가 될 것 같습니다.
http://twitter.com/#search?q=nexuss
웹을 통해 남긴 기록은 서비스가 중단되거나 인터넷이 망했을 경우 손을 쓸 수 없어 아쉬운 경우가 많습니다. 트위터나 페이스북 등의 서비스를 백업할 수 있는 사이트가 있습니다. http://backupify.com/  
TechCrunch를 통해서 알게 된 서비스입니다. 

개인 계정은 서비스별로 하나의 계정만 백업할 수 있습니다. 2기가 까지는 무료로 제공되고 그 이상은 유료로 이용해야 됩니다.

아래 그림을 보시면 아시겠지만 상당히 많은 서비스들이 백업이 가능합니다. 구글의 서비스들이 절반이네요. facebook, Flickr, twitter, zoto, 그리고 구글 것들

OAuth라는 인증방식을 사용하기 때문에 해당 서비스의 동의 절차가 필요합니다.

트위터도 마찬가지입니다. 트위터는 인증과 동시에 글도 남길 수 있게 되었네요.

트위터의 인증 모습입니다.

바로 데이터가 나오는 것은 아니고, 24시간에서 48시간 후에 초기 백업 내용을 확인할 수 있게 되었습니다.

국내에 카피 서비스가 있어도 좋은 아이템이라는 생각이 듭니다. 



+ Recent posts