iOS 달력앱을 재정의하는 Sunrise 앱

요즘 메일을 재정의한다는 Mailbox앱이 인기인데 Sunrise가 달력앱으로 인기를 끄는 중이더군요.

IMG_0646

SunriseMailbox처럼 직접 서버를 사용하며 기존 구글 캘린더 등에서 제공하지 못하는 다양한 기능을 제공해줍니다. 이 앱은 포스퀘어(Foursquare)의 직원이었던 디자이너들이 만들었다고 하네요. (그래서인지 동영상에서도 포스퀘어 아이콘을 볼 수 있네요)

Sunrise는 원래 달력의 정보를 메일로 전송해주는 뉴스레터 서비스로 시작했었는데 누구도 기존의 달력앱을 개선하려고 하지 않았기 때문에 필요한 정보를 아름다운 UI와 함께 제공해주는 앱을 만들고자 했답니다.

IMG_0647

앱을 실행하고 구글 캘린더와 페이스북을 연동하게 되면 이벤트들과 생일, 그리고 날씨들로 달력이 채워지게 되고 각 이벤트에 대해 누구와 참여하는지 페이스북 프로필로 보여지게 됩니다. 저는 페이스북 이벤트를 별로 안 써서인지 생일만 엄청나게 보이긴 하더군요. UI가 가장 뛰어난 부분인데 달력을 스와이핑하면 2주만 보이던 공간이 자연스럽게 한 달이 보이게 변하게 되고 여러 달을 편리하게 열람할 수 있습니다. 그리고 왼쪽 아래의 버튼을 누르게 되면 오늘로 쉽게 돌아올 수 있습니다.

sunrise_screens03

그리고 “Lunch with xx tomorrow at 1pm.” 같이 타이핑만 해도 일정이 등록되는 기능도 제공합니다. 저는 주로 Fantastical을 쓰는데 Fantastical이 이 기능으로 유명하죠. 그런데 Sunrise가 Fantastical이나 Calvetica같은 앱들에 비해 뛰어난 점은 그 앱들이 iOS의 기본 달력 API만 쓰는 것에 비해 Sunrise는 직접 서버를 사용하여 제약이 없다는 것이겠죠. 그래서 페이스북 이벤트 초대도 관리할 수 있고 Push 알림도 제공합니다.

Sunrise는 iOS용만 나와있고 아직 투자를 받지 않았다고 하네요.

저는 Fatastical이 손에 익어서 그런지 페이스북 이벤트가 별로 없어서 그런지 Fantastical에 더 손이 가는데 Sunrise도 잘 사용하면 좋을 것 같습니다.

 

Sunrise 홈페이지

Sunrise Brilliantly Redefines Calendar Apps On iOS | TechCrunch

 

Java에서 Javascript의 encodeURIComponent 구현하기

자바에서는 URLEncoder를 사용해서 인코딩을 할 수 있는데 자바스크립트에서 사용하는 encodeURIComponent와 살짝 다르다.

Java의 URLEncoder:

  • literal characters (regex representation): [-a-zA-Z0-9._*]
  • the space character " " is converted into a plus sign "+".

JavaScript의 encodeURIComponent():

  • literal characters (regex representation): [-a-zA-Z0-9._*~'()!]

즉, 자바에서는 빈칸을 ‘+‘로 바꾸고 자바스크립트는 빈칸을 ‘%20‘으로 변환,
그리고 자바스크립트에서는 ~'()!을 그대로 두지만 자바에서는 각각 UTF-8 인코딩시킨다.

결국 빈칸과 ~'()!을 변환시키면 URLEncoder의 결과를 encodeURIComponent의 결과와 동일하게 만들 수 있다.

 

public static String encodeURIComponent(String s)
  {
    String result = null;
 
    try
    {
      result = URLEncoder.encode(s, "UTF-8")
                         .replaceAll("\\+", "%20")
                         .replaceAll("\\%21", "!")
                         .replaceAll("\\%27", "'")
                         .replaceAll("\\%28", "(")
                         .replaceAll("\\%29", ")")
                         .replaceAll("\\%7E", "~");
    }
 
    // This exception should never occur.
    catch (UnsupportedEncodingException e)
    {
      result = s;
    }
 
    return result;
  }

안드로이드에서 개발한 앱과 서버간의 통신이 제대로 안되어 헤맸었는데 빈칸이 다르게 변환되는 것이 문제였다.

Java equivalent to JavaScript’s encodeURIComponent that produces identical output?

BeenTogether. 사랑한지