Social Reiot

Social Game Developer wandering in strange dungeon.

TextMate Tips

깔끔하게 지우기

1
2
3
$ rm ~/Library/Preferences/com.macromates.*
$ rm -rf /Library/Application Support/TextMate/
$ rm -rf ~/Library/Application Support/TextMate/

한글 폰트 설치

2바이트 문자들이 모두 깨지는 관계로 전용 한글 폰트를 구해야 한다. 누가 나눔코딩글꼴의 TextMate 버전을 안 만들어줄까?

http://www.appleforum.com/application/45362-textmate에서-한글-글꼴폭-문제.html

유용한 단축키

⌘(cmd, window) ⌥ (option, alt) ^(control) ⇧(shift)

1
2
3
4
⌘T : 빠른 파일 찾아가기
⇧⌘T : 현재 파일의 심볼 찾기
^⇧V : 현재 파일의 정적 분석 및 검증(Validation). 파이썬일 경우 pylint, 자바스크립트일 경우 jslint 가 실행된다.
⌃⌘R : 현재 편집중인 파일을 Project+ 사이드바로 찾기

더 많은 팁은 http://stackoverflow.com/questions/99807/what-are-some-useful-textmate-shortcuts 에서 찾아볼 수 있다.

추천 번들 & 플러그인

  • Zen Coding: TextMate도 강력한 툴이지만 이놈도 만만치않다. 마법같은 ⌘R 의 힘을 느껴보시라.
  • Project+: 보다 똑똑해진 사이드바
  • Get Bundles: 번들 다운로드 및 업데이트를 위한 번들
1
2
3
4
$ mkdir -p ~/Library/Application\ Support/TextMate/Bundles
$ cd !$
$ svn co http://svn.textmate.org/trunk/Review/Bundles/GetBundles.tmbundle/
$ osascript -e 'tell app "TextMate" to reload bundles'
  • PyLint: 파이썬 소스 파일에 대해서 ^⇧V 로 정적 분석 및 검증을 할 수 있다. 설치한 후 TextMate PATH 에 /usr/local/bin 을 추가해야 한다. 각종 경고 목록은 http://www.logilab.org/card/pylintfeatures 에 있다.  현재 파일에서 경고를 끄려면, 파일 맨 위에 # pylint: disable=W0232,R0902,C0103,C0301 를 넣으면 된다. (가급적 .pylintrc 를 사용하길 권한다.)

정규식

Basic

  • 캡처한 문자열은 $1, $2 .. 를 이용한다. $0 은 전체를 의미한다.

no trailing space after comma

pylint 를 돌려보면 콤마(,) 다음에 공백을 무조건 넣으라고 한다. negative look ahead를 이용하면 간단하다.

1
2
Find: ",(?![\s])"
Replace: ", "

참고 자료

Safari Debugger Break for Undefined Exception

웹킷 기반 브라우저(크롬, 사파리)의 오류 콘솔 - 스크립트 탭에서 저 버튼을 두 번 눌러 보라색으로 만들면, 미확인 예외들이 발생할 경우 자동으로 브레이크가 걸린다. 이걸 이제서야 알았다니..

Empty List Property From Bulkloader

벌크 로더를 이용해서 ListProperty을 내보내거나 읽어들일 때, 보통 다음과 같은 람다 함수를 사용한다.

1
2
import_transform: "lambda x: [transform.create_foreign_key('Product')(key_name) for key_name in x.split(',')] if x else None"
export_transform: "lambda x: ','.join([str(key.name()) for key in x]) if x else ''"

내보내기는 어떻게 하든 관계없지만, 읽어들일 때에는 문제가 발생한다. 기본적으로 ListProperty 는 빈 리스트를 받아들이지 않는 데다가, None 을 넣어 두면 그 다음 읽을 때 BadValueError 가 발생하기 때문이다.

  • default=None 으로 선언한 경우 BadValueError 발생
  • required=False 은 허용되지 않음
  • validator=lambda x:x 역시 BadValueError 가 발생

현재 해결책은 참고 링크처럼 소스를 고치지 않는 한 없는 듯하다. :(

Bulkload Nullable ReferenceProperty

어떤 모델의 참조 속성은 꼭 키값이 들어있지 않고 때로는 None 일 수도 있다. 만약 Null 인 참조 속성을 업로드할 때

1
2
3
4
- property: field
  external_name: field
  import_transform: transform.create_foreign_key('Field')
  export_transform: transform.key_id_or_name_as_string

처럼 하게 되면, 에러가 발생한다. 이를 해결하려면 import_transform 을 다음과 같이 수정하면 된다.

1
import_transform: transform.none_if_empty(transform.create_foreign_key('Field'))

Bulkload Auth_domain Problem

Google App Engine Launcher 1.4.1 부터 auth_domain 을 지정한 로컬 서버(dev_appserver)에 대해, appcfg.py 로 download_data 를 할 때 인증 문제가 발생한다.

해결책은 url=http://localhost:8080/_ah/remote_api 를 사용하면 된다. 끗.

Facebook Canvas Redirect

페이스북 캔버스 앱의 경우, userid, oauth_token, expire 시간 등을 암호화한 signed_request 을 받게 된다. 이때 userid 가 없다면 미인증 사용자이므로 graph.facebook.com/oauth/authorize 로 리다이렉션을 해야 한다. 문제는 iframe 에서 리다이렉트를 할 때 iframe 안에 또다른 페이스북 iframe 이 생긴다는 점이다. 이를 해결하려면 아래와 같이 하면 된다.

1
2
3
4
5
6
def redirect(self, url):
  logging.debug('redirect to %s'%url)
  if re.search("^https?:\/\/([^\/]*\.)?facebook\.com(:\d+)?", url.lower()):
  return HttpResponse('<script type="text/javascript">\n' + \ 'top.location.href = "%s";\n</script>' % url)
  else:
  return HttpResponseRedirect(url)

jQuery.removeClass(function)

지우려는 클래스의 구체적인 이름 대신 정규식 패턴만 안다고 하면, jQuery.removeClass(function)을 이용하면 된다. 단 이때 각 클래스명에 대해서 함수가 호출되는게 아니고, 전체 클래스 이름들이 공백으로 구분되어서 콜백으로 넘겨지기 때문에 직접 클래스 이름을 순회해야 한다.

다음 샘플은 클래스명이 unit- 으로 시작하는 걸 찾아서 지우는 코드다.

1
2
3
4
5
6
7
8
9
$(...).removeClass(function(index,class_list_str){
  var class_list = class_list_str.split(' ');
  for ( var i = 0 ; i < class_list.length ; i ++ ) {
      var cls = class_list[i];
      if ( cls.match(/unit-.+?_(L|R)/) ) {
          return cls;
      }
  }
})