LSUIElement 는 OSX Application Activation Policy 와 관련 있는 옵션입니다.. (.plist 파일에서 설정 )


보통 FaceTab for Facebook 과 같은 Status Bar Item base Application 에서 사용하는 옵션입니다.
해당 옵션을 키면, Dock에 노출되지도 않고, Menu가 노출되지도 않습니다.



NSApp이 NSApplicationActiviationPolicyAccessory로써 동작하게 되는것이죠.
 

    /* The application does not appear in the Dock and does not have a menu bar, but it may be activated programmatically or by clicking on one of its windows.  This corresponds to LSUIElement=1 in the Info.plist. */
    NSApplicationActivationPolicyAccessory, 

 

주석에 나와 있는데로, User가 click 을 하거나, 소스코드상에서 강제로 Activate 시키지 않으면 실행이 되지 않습니다.
그래서, 환경설정등을 위해 Window를 띄워도 아래와 같이 Deactivate된 상태로 노출되게 됩니다. 



이를 해결 하기 위해서 아래의 한줄만 써주면 됩니다.

    [NSApp activateIgnoringOtherApps: YES];


OSX 개발 newbie 라... 이런 모드가 있는지도 몰랐고 ;ㅂ;
저 한줄의 코드를 찾기위해, 1시간 가량 구글이랑 놀았습니다. ㅠㅠ
  

https://github.com/Mozketo/LaunchAtLoginController

최근 시작하려고 하는 프로젝트중에 하나가, OSX application이라 이래저래 기술 조사를 하고 있습니다 ㅎ
구현해야하는 기능중에 하나가, Mac이 실행될때, application이 자동 실행되는것인데요,
이래저래 살펴보다가 깔끔하게 정리하고 공유된것이 있어서 소개 드립니다.


Project에 소스를 포함시키고. 아래 method 하나 호출해주면 됩니다.

[self.launchAtLoginController setLaunchAtLogin:YES];

 

내부를  살짝 살펴보니, 

LSSharedFileList 라는 Framework Method들을 사용하고 있는데요,
이게 바로 LaunchService를 담당하는 모듈입니다.
LSSharedFileList에 대한 자세한 설명은 


 
실해시켜보니, 자알 들어갑니다 :)

덧.

Code를 살펴보니, Code 제스타일은 아니지만, 나름 Key-Value Observing도 할수 있게, 잘 되어 있습니다.
안심하고 쓰셔도 될 소스라고 생각됩니다 :) 

Tiger 혹은 그 이하 Version에서는 동작하지 않습니다. 

NSWorkspace *wc = [NSWorkspace sharedWorkspace];
NSString *urlString =@"http://taehoonkoo.tistory.com";
NSURL *url = [NSURL URLWithString:urlString];




참고 자료 :

http://stackoverflow.com/questions/2965615/open-url-with-safari-no-matter-what-system-browser-is-set-to

 

A. Bracket을 같은 줄에 쓰는 스타일 - Java 개발자들이 선호
 

if {
}


 
B. Bracket을 개행한후에 쓰는 스타일 - C 개발자들이 선호

if
{
}



다녔던 회사들중에
C 로 개발하던 회사에서는 Coding Convention 으로 B Style이 표준이었고,
Java로 개발하던 회사는 A Style이 표준이었습니다.

사실 왜 C 개발자들이 B Style을 선호하는지에 대한 별다른 생각이 없어서,
Java로 개발하는 회사로 이적한후 A Style을 따르고,
C로 개발할때도, A-Style로 하도록 습관을 고쳤습니다.

그러다 문득..

if ( a== 1) {
}
else {
}


같은 코드가 있을때 Debuggin 위해 else 조건문만 항상 실행하려고 하니 
B Style에서는

#if 0
if (a  ==1) 
{
}
else
#endif 
{



이렇게만 해주면되는것을

 A Style에서는 조건을 항상 거짓으로 변경하거나
개행한후에 #if 0 를 해주어야 하더군요..
정말 별건 아니지만, ㅋㅋㅋ
B Style로 돌아 갈까 심각하게 고민중입니다 ㅎ

혹시 A Style이 가지고 있는 장점이 있을까요? :)

 


<filter>


<filter-name>encodingFilter</filter-name>


<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>


<init-param>


<param-name>encoding</param-name>


<param-value>UTF-8</param-value>


</init-param>


</filter>


<filter-mapping>


<filter-name>encodingFilter</filter-name>


<url-pattern>/*</url-pattern>


</filter-mapping>



spring 에서 제공하는 CharacterEncodingFilter 를 걸어주면된다.
본인의 프로젝트에서는 UTF-8 을 사용하였음으로,
param-value에 UTF-8을 사용하였다.

 

NSString *myDescription = @"String";

[[UIColor colorWithRed:119/255.f green:119/255.f blue:119/255.f alpha:1.f] set];

[myDescription drawInRect:CGRectMake(10, 200, 85, 15

                     withFont:[UIFont systemFontOfSize:12.f]

                lineBreakMode:UILineBreakModeClip

                    alignment:UITextAlignmentCenter];


drawInRect:를 호출하기전에
[[UIColor blackColor] set];

이런식으로 호출해주시면 됩니다 ㅎㅎ 

JUnit4 에서 Exception 발생이 나야 하는 Test 인 경우를 캐치 하는 방법

@Test(expected=IndexOutOfBoundsException.class)
 public void verifyZipCodeGroupException() throws Exception{		
  Matcher mtcher = this.pattern.matcher("22101-5051");
  boolean isValid = mtcher.matches();			
  mtcher.group(2);		
 }
 
우와 같이 @Test annotation 에 expected argument를 넘겨 주면 된다.  

그림 1.



Corner에 라운드가 처리된 ImageView가 필요해서, 만들게 되어 이러게 공유 합니다 ^^

구글링 해보면, 이런저런 기법들이 많이 나오는데요, 복잡한 해법들이 많은데,
저는 UIBeizerPath라는 녀석을 이용해서, 간단히 구현 하는 방법을 소개 해볼까 합니다.

아직 UIImageView를 이용하면 가장 좋을것 같은데, 방법을 따로 못찾아서, UIView를 상속 받아서, 구현하였습니다.
혹시 아시는 분 있으면 공유! 부탁드립니다 !

RoundRectedImageView.h

#import <Foundation/Foundation.h>

@interface RoundRectedImageView : UIView {

}

@property (nonatomic,retain) UIImage *image;

-(id) initWithImage:(UIImage *) aImage;

@end


RoundRectedImageView.m

#import "RoundRectedImageView.h"


@implementation RoundRectedImageView

@synthesize image = mImage;

-(id) initWithImage:(UIImage *) aImage {

    

    self = [super initWithFrame:CGRectMake(0, 0, aImage.size.width, aImage.size.height)];

    self.image = aImage;

    self.backgroundColor = [UIColor clearColor];

    return self;

}


-(void) drawRect:(CGRect)rect {

    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:UIRectCornerAllCorners cornerRadii:CGSizeMake(16.0, 16.0f)];

    [path addClip];

    [self.image drawInRect:rect];

}

-(void) dealloc {

    self.image = nil;

    [super dealloc];

@end


코드양이 별로 없어서, 설명도 간략하겠군요 :)
drawRect: Method만 살펴 보시면 됩니다.

1. Round가 있는 사각형 UIBezierPath Object를 만든다.
2. addClip 을 호출하여, 앞으로 그려질때, clipping 되도록한다.
3. UIImage를 그려준다.



이렇게 해주면 그림.1 의 우측 그림과 같이 RoundRect 된 ImageView가 됩니다. ^^



 

개인적으로 읽을 책들을 정리하고, 
왜 읽는가를 생각하면서 읽기 위해 정리해봅니다.

그외에 책을 추천해주시면 너무나들 감사하겠습니다 :)

1. 디자인과 인간심리



소프트웨어 개발자가 디자인에 대한 이해가 필요 할까요?

그럼요 ! 소프트웨어는 혼자 만드는 게 아니니까요.
그래픽 디자이너, UX 설계자 등과의 원만한 커뮤니케이션을 위해 그들의 일에 대한 이해가 필요 하다고 생각되어 읽기 시작했습니다.

아이러니 하게도 

" 이책은 한번에 3장 이상 읽기가 힘드니, 책 디자인에서 인간심리를 전혀 고려하지 않은 셈이죠 ;ㅂ; "
 
2. 실전 코드로 배우는 실용주의 디자인 패턴


읽어본 디자인 패턴책이, Head First , GOF 두권 정도 인데,
디자인 패턴에 대한 깊은 성찰을 위해,
여러 사람이 쓴 책을 읽어 보고 싶다는 생각이 들어, 집어 들었습니다.


아자 아자 아자 부디, 책을 읽는 것을 넘어, 서평을 쓸 정도의 부지런함이 생기길 바라며..
시작합니다 :)
 
 

다들 아시다 시피,  Objective-C 는 Abstract Class가 없습니다.

OO를 Design 할때, Abstract Class를 사용해야 할 일이 있습니다. ( 예 : Factory Method Pattern )

문법단에 없는 녀석이기에, Compiler Level에서는 Error를 발생시킬순 없지만,
RunTime에 강제하도록 하는 방법을 한번 살펴보도록 하겠습니다.
 
아래에 원문이 있으니, 한번씩 읽어보세요 :)

 http://stackoverflow.com/questions/1034373/creating-an-abstract-class-in-objective-c

원리는 간단합니다.

init 과 override를 강제 시키고 싶은 곳에서 Exception을 날린다.

 

-(id) init {

    @throw [NSException exceptionWithName:NSInvalidArgumentException reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)] userInfo:nil];

    

    return nil;

}


 위의 예제 코드 와 같이 말이죠

해당 Class를 그냥 사용하면, 아래와 같이 RunTime Error가 발생됩니다.

 
장문의 Exception Throw를  그냥 매번 쓰고 있자니 답답하군요

prefix header에 아래와 같이 정의 합니다.

#import <Availability.h>


#ifndef __IPHONE_3_0

#warning "This project uses features only available in iPhone SDK 3.0 and later."

#endif


#ifdef __OBJC__

    #import <UIKit/UIKit.h>

    #import <Foundation/Foundation.h>

#endif


#define mustOverride() @throw [NSException exceptionWithName:NSInvalidArgumentException reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)] userInfo:nil]

 
그리고 -(id) init은 아래와 같이 변경

-(id) init {

    mustOverride();

    return nil;

}

 
자 이러면 쉽게 되는군요.

compile 단에서 이루어지는게 아니라, 아쉽지만,
그렇다고 아무런 안전장치 없이 또 사용하는것보단 나은것 같습니다 ^^

사족으로 Java의 Interface 대신 Protocol 을 사용하고 있긴 하지만, Interface와 abstract class는 문법상으로 좀 제공해줬으면 합니다.
그럼 좀 더 great할것 같군요 :) 

+ Recent posts