20111018 :: [OSX] Mail 앱에서 이름이 중복으로 들어가는 경우

이건 상당히 글로벌한(?) 문제인 것 같은데, OSX의 Mail 앱에서 (심지어는 최근에 업그레이드된 5.0에서) 나타나는 문제이다. 아마 이런 문제를 겪고 있는 사람이 꽤 될 것 같은데… 바로 주소록에서 ‘성’ 란을 빈칸으로 비워두고 이름란에 성을 붙여서 쓰는 경우에, 메일 작성 시 보내는 사람 주소를 자동완성으로 입력하면 이름이 중복되는 문제다.

예를 들어 ‘홍길동’이라는 이름이 주소록에 “홍” , “길동” (성, 이름) 으로 들어가 있지 않고 “”, “홍길동” 으로 이름에 3글자가 모두 들어 있는 경우, Mail 앱에서 홍길동에게 메일을 보내고 나면 “홍길동”, “홍길동”으로 이름이 바뀌어 있는 문제이다.

이는 상당히 고질적인데, 주소록에서 성 필드를 지우고 이름을 다시 “”, “홍길동”으로 수정해도 다시 한 번 메일을 보내면 이게 “홍길동”,”홍길동”으로 중복해서 수정되어 버린다. 아마 이 문제에 대한 리포트를 애플이 안 받진 않았을텐데… 버그인 건지 뭔지 도통 모르겠다. 아마 영어권에서는 성과 이름이 각각 분리되어 있으니 크게 불편을 못느끼는 것일 수도.

1. 자동 완성 기능을 사용하지 않는다. (Disable Auto Complete)

당연하게도 자동완성 기능을 사용하지 않으면 이런 문제를 겪지 않는다. 하지만 너무 불편하다. 친구에게 보내는 메일같은 경우에는 수신란에 메일 주소만 들어가도 상관 없지만 매번 “홍길동 <honggildong@mailmail.com>” 과 같은 식으로 주소를 넣어줄 수는 없는 일 아닌가. 따라서 Mail 앱을 잘 사용하지 않는 경우에만 이 방법을 추천한다.

2. 성 필드에 공백을 입력해 둔다. (Place white space into first name field)

이건 좀 꼼수인데, 성 필드에 공백 문자를 하나 입력해 두는 거다. 이러면 이 문제가 발생하지 않고 ” “,”홍길동”이 되어 일단 보이는데는 큰 문제가 없어 보일 수 있다. 대신에 이름 자동 완성 이후에 파란 타원 모양으로 처리되는 그래픽이 좀 밀려 보이는 문제는 있을 수 있겠다. 게다가 주소록이 큰 경우에 모든 사람의 성에 공백을 넣기란….[1. 물론, 애플 스크립트를 쓴다면 쉽다.]

3. “이전 수신자” 목록을 지운다. (Clear Previous Receipts)

Mail 앱은 “이전 수신자” 목록을 사용하는데, 이게 주소록에 추가되지 않은 연락처를 관리하거나 자동 완성을 좀 더 빠르게 하는 목적으로 있는 것 같다. 문제는 이곳에 중복된 이름으로 이름이 들어 있는 경우에 주소록에 해당 메일 주소가 있으면 이 내용으로 업데이트 된다는 것. Mail의 윈도우 메뉴에서 이전 수신자를 클릭하여 열리는 목록의 전체를 지워버린다. 일단 이 부분이 정상적인 이름이 표시된다면 중복 이름은 표시되지 않는다.

4. “이전 수신자”를 아예 사용하지 않는다. (Disable Previous Receipts)

3번의 해결책이 완벽하지는 않다. 모종의 이유로 이전 수신자에 중복된 이름이 들어가버리는 경우가 생길 수 있는데, 이러면 똑같은 문제가 다시 발생할 수 있다. 따라서 아예 이전 수신자 기능 자체를 꺼두는 것도 (정신 건강에) 도움이 될 수 있다.

터미널을 열고 다음 명령을 입력한다.($ 는 입력하지 않는다. 그냥 터미널 프롬프트다)

$ defaults write com.apple.mail SuppressAddressHistory -bool YES

이 정도 해주면 좀 도움이 될 수 있을 것도 같다. 끝.

20110828 :: iOS5 : Empty Application에서 Storyborad 생성하기

잊기전에 하는 메모

  1. Storyboard

iOS5에 추가된 기능으로, 하나의 파일에서 애플리케이션의 모든 혹은 일부의 UI를 디자인하고 각 뷰의 상관관계 및 네비게이션을 설정할 수 있는 도구.

  1. Empty Application

AppDelegate외에는 다른 클래스는 전혀 만들어지지 않은 프로젝트. 보통 RootViewController 라는  UIViewController 를 생성해서 메인 화면을 작성하게 된다.

  1. Empty Application에서 Storyborad  기반 앱으로 발전시켜가기
  1. 먼저 빈 스토리보드를 하나 생성한다. 이름은 주고 싶은대로.
  2. 프로젝트 세팅에서 타겟 세팅값 중 Main Storyborad File Base Name 속성을 새로 만들어 지정해준다.
  3.  AppDelegate.m 파일에는 앱이 런칭되었을 때 main window를 생성하는 코드가 있다. 이를 제거한다. 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
                                                    (NSDictionary *)launchOptions
{
    return YES;
}
  1. 스토리보드를 프로젝트에 연결하면 자동으로 윈도우는 생성이 된다. 최초 뷰를 생성하기 위해서는 인터페이스 빌더에서 View Controller 객체를 삽입하면 된다.

20110702 :: 비어있는 프로젝트에서 첫 화면 띄우기

안타깝게도 블로그 글이 아이폰 앱 개발 관련 글로 채워지고 있지만…  메모 차원에서…

  1. 프로젝트 생성 : EmptyApp 이라는 이름으로 프로젝트 생성
  2. Storyboard 생성 : EmptyApp.stroyboad라는 이름으로 빈 스토리보드 생성
  3. 생성된 스토리보드에서 첫번째 뷰 컨트롤러 생성. initial scene 인지는 속성창에서 체크되어 있는지 여부로 알 수 있다.
  4. 앱 델리게이트에서 다음 코드로 앱을 초기화 한다. 일부 코드는 이미 생성되어 있음
-(BOOL)application:(UIApplication *)application didFinishedLaunchingWithOptions:(NSDictionary *)launchingOptions{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainscreen] bounds]];

    UIStoryboard *myStoryboard = [UIStroyboard storybordWithName:@"EmptyApp" fromBundle:[NSBundle mainBundle]];
    UIViewController *rootViewController = [myStoryboard instantiateInitialViewController];

    [self.window addSubView:rootViewController.view];

    [self.window makeKeyAndVisible];
    return YES;

}

이외에도, plist 파일을 통해 main storyboard 파일을 지정해버리는 방법도 있다.[1. 다른 템플릿에는 위의 코드가 없어서 찾아본 내용. 7/2 추가]

20110628 :: iOS5 SDK의 새로운 기능들

iOS5는 알림센터와 같은 새로운 사용자 환경이 추가되었지만, 새로운 형태의 앱을 더욱 쉽게 개발할 수 있도록 하는 새로운 기능들이 추가되었다.

iCloud Storage APIs

 

  • 클라우드 저장소인 iCloud를 통해 사용자의 파일을 저장하거나 (iCloud document storage) 사용자의 정보를 애플케이션간에 공유하는 (iCloud key-value data storage) 방법이 생겼다. iOS 및 OSX는 싱크 데몬을 제공하며 이를 통해 앱은 iCloud 환경에 있는 문서를 손쉽게 액세스할 수 있도록 한다.싱크 시 버전 충돌을 해결하기 위한 방법도 제공하고 있다.
  • 키-밸류 데이터를 iCloud에 저장하여 다른 디바이스나 다른 맥에서 동작하는 어플리케이션에게 데이터를 전달할 수 있다. 키-밸류 쌍의 최대 크기는 64KB이며 단일 키의 최대 크기는 4KB를 초과할 수 없다. 이는 NSUbiquitousKeyValueStore 클래스에 의해 제공된다.

 

iCloud Backup

 

iOS5는 iCloud를 통한 자동 백업을 사용할 수 있다. 샌드박스내의 도큐먼트 폴더내의 자료는 자동으로 백업된다.

 

자동 참조수

Objective-C 컴파일러에의해 객체의 참조수는 자동으로 관리된다. 따라서 retain, release, autorelease, dealloc 의 기능은 사용해서는 안된다. 또한 커스텀 retain, release 기능을 구현할 수 없다.

 

  • C구조체 내에 객체의 포인터를 저장하지 말 것
  • 객체와 객체가 아닌 자료형사이에 강제 캐스팅을 하지 말 것
  • NSAutoreleasePool 객체를 사용하지 말 것. 대신에 @autoreleasepool 키워드를 사용하여 오토릴리즈 블럭을 사용할 수는 있다.

Objective-C 컴파일러는 개발자에게 객체 그래프를 생각하고 사용하기를 권장한다. 즉 객체간의 관계를 생각해야지 리테인/릴리즈에 대해서 생각하지 않는 것이다. 이 점에서 ARC는 약한참조제거라는 개념을 포함한다. 즉 약한참조제거의 값은 객체가 해제된 지점을 가리키고 있을 때 nil의 값을 갖는다. 변수는 weak, strong 이라는 새로운 선언 속성값을 갖는다.

 

@property (strong) MyClass *myObject;

@property (weak) MyOtherCloass *delegate;

 

(각각, retain, assign에 대응하는 선언 방식이다)

 

 

스토리보드

 

iOS5에서 개발툴의 가장 큰 변화이다. 메인 nib 파일을 대체하는 스토리보드는 프로그램의 모든 화면 UI를 포함하고 어떤 뷰에서 어떤 뷰로 이동할 수 있는지를 지정하고 그 관계를 그래프로 나타내준다. 뷰간의 이동은 performSeaueWiehIdentifier:sender: 를 통해서 발생하며, 이는 화면 아울렛을 통해 지정이 가능하다.

 

기존 iOS4에서는 새로운 뷰로 이동하기 위해서는 해당 클래스의 인스턴스를 만들어 네비게이션 컨트롤러의 제어를 통했으나, 현재는 스토리보드상에서 모든 작업을 할 수 있다. 즉, 정보를 나열하고 보여주는 브로슈어 앱의 경우에는 IB만 사용하여 완전한 구현이 가능하다.

 

새로운 프레임워크

 

GLKit

오픈GL을 쉽게 다룰 수 있도록 하는 GLKit.

 

CoreImage

비디오와 스틸이미지를 변형하는 파워풀한 필터를 제공한다. 이미지를 보정하는 작업을 할 수 있으며, 얼굴 인식등의 기능도 제공한다.

 

트위터

트위터가 프레임워크로 통합되었다.

 

계정 프레임웍

싱글 사인온을 지원하는 프레임웍

 

일반보안서비스(GSS)

파일보안과 관련된 서비스

 

애플리케이션 디자인 레벨의 개선

UIDocument 클래스 지원.

  • 백그라운드에서 데이터를 비동기적으로 읽고/쓰는 것이 가능하며, 읽고 쓰는 동안에도 사용자의 터치에 반응할 수 있다.
  • iCloud 저장소내의 문서에 접근하는 것이 가능하다.
  • 쓰기 캐시를 지원하여 안전한 파일 쓰기를 지원
  • 파일 쓰기 중 버전 충돌에 대한 해결책 지원
  • 특정 시점에 자동 저장 기능
  • 플랫파일/패키지 파일 지원
  • 코어데이터를 사용하는 앱을 위해 UIManagedDocument 서브 클래스가 지원된다.

 

데이터 보호 개선

UIKit 컨트롤의 커스텀 객체

-대부분의 객체 (툴바와 네비게이션 바, 검색바, 슬라이더 등)의 색상과 배경 이미지, 타이틀 위치를 옮길 수 있다.

– 어떤 객체들은 직접 변경하며 어떤 객체들은 외양 프록시를 통해 기본값을 지정할 수 있다.

외양 프록시는 기본값을 변경하도록 해주는 객체이다.

 

컨테이너 뷰 컨트롤러

컨테이너 뷰는 다른 뷰 컨트롤러를 담는 뷰 컨트롤러인데, UINavigationController, UITabBarController, UISplitViewController 를 말한다. 이러한 뷰 컨테이너가 제공하는 컨텐츠들을 조합하여 다른 컨테이너 뷰 컨트롤러를 만드는 것이 가능하다. 컨테이너 뷰는 뷰컨트롤러의 부모로서 동작하며, 각각의 뷰 컨트롤러에 메시지를 보낼 수 있다.

 

페이지 기반 애플리케이션

책자와 같은 형태로 책장을 넘기며 동일한 템플릿 내에 데이터가 바뀌어 표시되는 형태의 앱을 쉽게 만들 수 있게 되었다. UITableView와 마찬가지로 datasource를 이용하여 책의 내용을 구성하는 것이 가능하다.

 

 

20110607 :: 애플을 절대로 뛰어 넘을 수 없는 당신들에게.

스티브 잡스의 새 세탁기 구매기

스티브 잡스에 대한 이야기는 사실 애플의 키노트만 있은 직후면 워낙에 인터넷 이곳 저곳을 달구는 이야기 소재라, 좀 식상한 감이 없잖아 있습니다. 최근 애플을 이야기할 때는 항상 “혁신”이라는 이야기를 하고 잡스를 이야기할 때는 “해적의 리더십”이라느니 뭐 그런 이야기를 많이들 하고 있습니다. 그러면서 애플 같은 기업 혹은 애플을 뛰어 넘는 기업이 되기 위해서는 우리도 “인문학[1. Liberal Arts]”을 해야 한다는 뭐 그런 이야기들이 나돌면서 때아닌 “인문학” 열풍이 그것도 진짜 “인문학”[2. the Humanities]이 열풍이되는 웃지도 웃지 않을 수도 없는 그런 풍경이 연출되고 있습니다.

하지만 진작 본질은 인문학에 있지 않습니다.[3. 그것이 문예를 말하는 인문학이든, 교양을 말하는 인문학이든 말이죠] 애플이 ‘혁신’을 이룬 것은 절반의 사실입니다. 즉 이것은 어디까지나 애플 외부에서 애플을, 그리고 애플의 제품을 바라보았을 때 이야기일 뿐이라는 말입니다. 애플의 제품은 애플 내부에서는 혁신이라 부르지 않을 것입니다. 그것은 단순히 “관심을 갖고 바라보았더니 그리 되었더라”의 산물일 뿐입니다.

그러니까, 결국 스티브 잡스가 천재다? 뭐 그런 말을 하려는 건 더더욱 아닙니다. 애플의 화려한 재기. 그리고 그 현상을 뒤덮는 수 많은 미사여구들. 그리고 그런 것들에 현혹되어 가장 큰 낭패를 보는 이들은 소비자가 아닌 경쟁사들입니다.

애플을(잡스를) 배우고 싶고, 뛰어 넘고 싶어하는 기획하는 사람, 경영하는 사람이 정말 많이 있습니다. (개발/디자인을 하는 사람은 애플에서 일을 하고 싶어 하지요) 그들에게 잡스는 일종의 지표이자 롤 모델이기도 하고 동경이기도 합니다. 덕분에 또 많은 글 좀 쓴다는 분들이 잡스에 대한 글을 써서 책도 많이 파신 것으로 알고 있습니다.

쩝, 그런데 그런 모든 정보들 가운데서 얼마나 그중에 과연 ‘얼마나 가슴에 와 닿는’ 문구가 당신에게 있었는지는 모르겠습니다. 그리고 ‘어떻게 하라’고 제시하는 그런 글이 또 있었을까요? 에이 설마요. 스티브 잡스가 직접 자기 이야기를 쓰더라도 아마 그건 알려주지 않을 것입니다.

그럼에도 불구하고 저는 철저히 기획자의 입장에서 생각할 때 무엇이 지금의 애플의 성공을 이끌었는지 말해준다고 확신하는 에피소드가 바로 다음의 이야기라고 생각합니다. 새로운 에피소드는 아니고 한 몇 년 전부터 많이 떠돌던 새 세탁기를 사는 스티브 잡스 가족의 이야기입니다.

 

Design is not limited to fancy new gadgets. Our family just bought a new washing machine and dryer. We didn’t have a very good one so we spent a little time looking at them. It turns out that the Americans make washers and dryers all wrong. The Europeans make them much better – but they take twice as long to do clothes! It turns out that they wash them with about a quarter as much water and your clothes end up with a lot less detergent on them. Most important, they don’t trash your clothes. They use a lot less soap, a lot less water, but they come out much cleaner, much softer, and they last a lot longer.

We spent some time in our family talking about what’s the trade-off we want to make. We ended up talking a lot about design, but also about the values of our family. Did we care most about getting our wash done in an hour versus an hour and a half? Or did we care most about our clothes feeling really soft and lasting longer? Did we care about using a quarter of the water? We spent about two weeks talking about this every night at the dinner table. We’d get around to that old washer-dryer discussion. And the talk was about design.

We ended up opting for these Miele appliances, made in Germany. They’re too expensive, but that’s just because nobody buys them in this country. They are really wonderfully made and one of the few products we’ve bought over the last few years that we’re all really happy about. These guys really thought the process through. They did such a great job designing these washers and dryers. I got more thrill out of them than I have out of any piece of high tech in years.

 

영어라서 거부감 느끼시는 분들이 간혹 있으셔서 간단하게 해석해보자면…

디자인은 단지 예쁜 장식에 그치는 것이 아닙니다. 우리 가족은 최근에 새 세탁기와 건조기를 샀어요. 우린 살만한 좋은 물건이 없어서 이리 저리 살펴보는데 약간 시간을 썼지요. 그러면서 보았더니 미국 사람들은 세탁기와 건조기를 순 엉터리로 만들고 있다는 걸 알았습니다. 유럽 사람들은 그에 비해 훨씬 나은 제품을 만들고 있구요. 하지만 그건 시간이 두 배나 걸리더군요! 알고보니 유럽식 세탁기는 물을 1/4 밖에 안쓰고 그래서 옷에는 세제 찌꺼기가 훨씬 더 적게 남게 됩니다. 가장 중요한 것은 그건 옷을 망치지 않는 다는 것이죠. 유럽식 세탁기는 더 적은 세제와 더 적은 물을 씁니다. 하지만 옷은 더 깨끗해지고 부드럽고 또 그 만큼 더 오래 입을 수 있게 됩니다.

우리 가족은 세탁기와 관련된 이해득실에 대해 잠시 이야기를 나눴습니다. 디자인에 대해서도 이야기를 했고, 우리 가족에게 어떤 가치가 중요한지에 대해서도 이야기했죠. 우리 식구들이 과연 세탁하는데 한 시간 반이나 걸리는 것과 한 시간만에 세탁이 끝나는 것을 비교하는게 가장 중요하다고 생각했나? 아니면 옷을 더 오래 입을 수 있고 세탁하고 나면 더 부드러운 감촉이 드는지가 중요한가? 물을 적게 쓰는 것에 대해서는 생각해 보았나? 우리는 저녁 식사 시간마다 이런 이야기를 하느라 보름을 보냈습니다. 우리는 구닥다리 세탁기에 대한 토론을 해나갔습니다. 그리고 그 이야기는 주로 디자인에 대한 것들이었죠.

우리는 결국 독일 밀레사의 제품을 사는 것으로 결론을 내렸습니다. 그 회사의 제품은 무척 비쌉니다. 하지만 그건 순전히 미국 사람들이 이 회사 제품을 많이 사지 않기 때문입니다. 이 세탁기들은 상당히 잘 만들어졌으며, 그 몇 가지 중 하나를 사고서 우리 가족은 유래가 없을 만큼 많이 행복해 했습니다. 이 회사에서 일하는 친구들은 프로세스를 잘 압니다. 그래서 세탁기와 건조기를 디자인함에 있어 엄청난 역량을 보입니다. 이것들을 사면서 전 지난 몇 년간 하이테크 제품을 살 때 느꼈던 것 보다도 더한 긴장감을 맛보았습니다.

아마 ‘포스트 잡스’, ‘포스트 애플’을 염두에 두고 있으면서 여기까지 읽으시면 제가 무슨 말을 하려는지 파악되셨으리라 생각됩니다.[4. 아직도 영문을 모르겠다면, 미안합니다만 그 꿈은 접으시는게 좋을 것 같습니다.] 제품을 만들 때 무엇을 가장 중요하게 생각해야 하느냐는 겁니다. 좋은 제품은 – 그것이 기획으로부터 출발하든 디자인으로부터 출발하든 – 단 하나의 지상 목표를 위해서 디자인될 수 없다는 것입니다. 그것은 사용자에게는 1차적인 것이 아니라 2차, 3차적으로도 훨씬 더 나은 선택이 될 수 있는 무언가를 제공할 수 있어야 하고, 그리고 만드는 입장에서는 제품에 집중하기 이 전에 사용자가 그 제품을 어떻게 쓸 것인지에 대한 프로세스에 집중할 수 있어야 합니다. 그리고 그것을 통합하는 것은 사실 그렇게까지 어려운 것은 아닙니다. 왜냐면 기획자들이 하는 일이 그 것 아닌가요?

원문에서 사실 가장 중요한 단어가 등장했습니다. 그것은 eco-value 니, 인문학이니 하는 그런 거창하거나 어려울 필요가 없는 단어입니다. 바로…

“CARE”.

정말 잘 만든 제품. 소비자들이 환호하고 열광할만한 제품을 만들기 위해서는 같은 분야가 아니더라도 정말 잘 만들어진 제품을, 제 값 한다는 제품을 써 보는 게 중요할 것 같습니다. 그리고 그 좋은 제품이 왜 좋은지를 본인이 깨닫지 못한다면 정말 좋은 제품을 만들 수도, 기획할 수도, 디자인할 수도 없을 것입니다.

적어도, 지금 국내에서는 애플의 경쟁자를 자처하고 싶어 안달하는 기업은 적지 않게 있습니다. 하지만 제품을 기획하는 최초 단계와 그 중점이 아쉽게도 “현재 돌릴 수 있는 생산 라인을 총 집결하는 방법”에 국한되어 있다면, 소비자가 care하는 가치를 제공해주기는 커녕 그냥 정크 푸드 만드는 공장을 열심히 돌리는 짓과 다름이 아니라는 겁니다.

애플에서 뭐 하나만 내 놓으면 온 대한민국이 난리간 나는데, 2년이 넘도록 난리만 나면서 왜 쓸만한 제품이 나오지 않는지가 궁금한 변방의 어떤 블로거가 또 쓸데없이 한 마디 하고 이렇게 하루가 저물어 갑니다.

 

ps. 잡스의 이런 저런 이야기를 다루는 책이 서점에 진짜 많은데, 전 ‘해적의 리더십’이라는 말 듣고는 완전 웃겨서 속으로 이런 생각을 했어요.

“그냥 지랄 옆차기를 하세요”