git push #REMOTE --delete #BRANCH
> 덤으로 LOCAL branch 삭제는 아래와 같다.
git branch -d #BRANCH
git push #REMOTE --delete #BRANCH
> 덤으로 LOCAL branch 삭제는 아래와 같다.
git branch -d #BRANCH
if (NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_6_1) {
// ios6.1 이하 버전
}
iOS7 이상 버전 처리
if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
// ios7 이상 버전
}
기존의 앱을 iPhone5 에서 실행 시키게 되면, 아래 와 같이 위아래 검은색으로 나오게 됩니다.
이를 통해서 따로 작업이 없더라도, 기존 앱들을 사용할 수 있게 해주는거지요.
그러나, 이래저래 만져보아도, 아이폰 5의 화면에 맞춰서 화면이 나오지 않는것입니다 ㅠ
처음에는 Window의 사이즈가 작게 설정 되어 있어서 그런가 했는데, 아니었습니다.
바로 Launch Image의 유무에 따라, 화면 사이즈가 달라지는 것이었습니다 ( 이건 좀 .... )
뭐 구현 방식이 좀 맘에 들지 않지만 Launcher 이미지를 넣어 보도록 하겠습니다.
( 준비된 이미지가 없다면, New Project 를 하나 만드시면 검은색 이미지 Default로 있으니 사용하시면 됩니다. )
위와 같이 변경해주면 4인치 꽉 채워서 동작하게 됩니다.
What is a 'Raphael'?
Raphael 은 SVG 와 VML 에 기반한 Web 상에서 Vector Graphics을 지원하게 해주는 Javascript Library 입니다.
Rich Internet Applicatoin 을 개발할 일이 있어, 기술 조사 겸 해서 스터디 해볼려고 합니다.
언제나 그럿듯이 Hello World 를 한번 찍어 보도록 하겠습니다.
1. Download Raphael
http://raphaeljs.com/ 에서 다운로드 하시면 됩니다
2. Sample Page 작성
3. javascript 작성
var paper = Raphael("hello",320,200);
var t = paper.text(50,50,"Hello Raphel");
hello 라는 div element 를 Raphael Paper 로 활용하게 되고,
그 Paper 에 text 를 그려 놓은 모습입니다.
Raphel 로 Hello Raphael 을 출력한 모습입니다.
Elements 를 살펴 보면, svg tag 밑에 element 로 들어 가도록 변환이 되어서 나옵니다.
이것만 봐서는 뭐가 강력한지 모르겠지만, 차근 차근 알아 보도록 하겠습니다.
1. Twitter API 찾기.
특정 Tweet을 Retweet 한사람을 조회 하는 API
https://dev.twitter.com/docs/api/1/get/statuses/%3Aid/retweeted_by
/statuses/:id/retweeted_by
* 주의 할점은 한번에 100명 까지만 조회 하기 때문에, parameter 중에 page 를 이용하여 추가 조회를 해야합니다.
2. Python 에서 Twitter API 호출하여, 20명 추출하기.
제가 분석할 tweet의 id 가 '194985314832490496' 임으로 호출 url 은 아래와 같이 됩니다.
https://api.twitter.com/1/statuses/194985314832490496/retweeted_by.json
해당 json 은 Dictionary 의 array 로 되어 있습니다. 제가 필요 한건 리트윗 하신분의 id 임으로 'screen_name' 속성만 가져오면 될것 같습니다.
아래는 'Visual JSON'이라는 어플로 호출해본 결과 입니다.
# -*- coding:utf-8 -*-
import httplib
import urllib
import csv
import codecs
import json
import random
tweet_id='194985314832490496'
def getJson(page):
conn = httplib.HTTPConnection('api.twitter.com')
conn.request("GET","/1/statuses/%s/retweeted_by.json?count=100&page=%s"%(tweet_id,page))
response = conn.getresponse()
data = response.read()
encoding=response.getheader('content-type').split('charset=')[-1]
conn.close()
jsonData = json.loads(data)
return jsonData
if __name__=='__main__':
entries = []
page=1
while(1) :
jsonData = getJson(page)
for jsonItem in jsonData :
entries.append(jsonItem['screen_name'])
if len(jsonData) < 100:
break
random.shuffle(entries)
winners = entries[0:20]
print winners
위의 코드는 해당 tweet의 screen_name 목록을 만들고 shuffle을 한후, 상위 20명만을 뽑아내는 코드 입니다.
| {#name}.png | iPhone | iPhone 3GS or before |
| {$name}@2x.png | iPhone Retina | iPhone4 and iPhone4S and some iPod Touch |
| {$name}~ipad.png | iPad | iPad 1 & iPad 2 |
| {#name}@2x~ipad.png | iPad Retina | iPad 3 aka 'New iPad' or 'iPad HD' |
[UIImage imageNamed:@"{#name}"];
위와 같이 작성하면, iOS 단에서 하드웨어에 맞는 이미지를 찾아 줍니다.
#import "KoreanSearchTest.h"
#import "ABContactsHelper.h"
@interface KoreanSearchTest()
@property (nonatomic, retain) ABContact *contact;
@end
@implementation KoreanSearchTest
@synthesize contact = mContact;
- (void)setUp
{
[super setUp];
// Set-up code here.
ABContact *contact = [ABContact contact];
contact.firstname = @"긱보드";
[ABContactsHelper addContact:contact withError:NULL];
self.contact = contact;
}
- (void)tearDown
{
// Tear-down code here.
[self.contact removeSelfFromAddressBook:NULL];
self.contact = nil;
[super tearDown];
}
- (void)testExample
{
NSArray *contacts = [ABContactsHelper contactsMatchingName:@"긱보드"];
STAssertTrue([contacts count] > 0, @"");
contacts = [ABContactsHelper contactsMatchingName:@"ㄱㅂㄷ"];
STAssertTrue([contacts count] > 0, @"");
}
@end@property (nonatomic, readonly) NSString *contactName; // my friendly utility @property (nonatomic, readonly) NSString *compositeName; // via AB @property (nonatomic, retain) NSString *chosung; // Geekboard add
@synthesize chosung = mChosung;
- (NSString *)chosung {
if(mChosung == nil) {
NSString *contactName = [self contactName];
const NSArray *chosung = [NSArray arrayWithObjects:@"ㄱ",@"ㄲ",@"ㄴ",@"ㄷ",@"ㄸ",@"ㄹ",@"ㅁ",@"ㅂ",@"ㅃ",@"ㅅ",@"ㅆ",@"ㅇ",@"ㅈ",@"ㅉ",@"ㅊ",@"ㅋ",@"ㅌ",@"ㅍ",@"ㅎ",nil];
NSString *textResult = @"";
for (int i=0;i<[contactName length];i++) {
NSInteger code = [contactName characterAtIndex:i];
if (code >= 44032 && code <= 55203) {
NSInteger uniCode = code - 44032;
NSInteger chosungIndex = uniCode / 21 / 28;
textResult = [textResult stringByAppendingFormat:[chosung objectAtIndex:chosungIndex]];
}
else {
textResult = [textResult stringByAppendingFormat:@"%C", code];
}
}
if([contactName isEqualToString:textResult] == YES) {
mChosung = [[NSString alloc] initWithString:@""];
}
else {
mChosung = [[NSString alloc] initWithString:textResult];
}
}
return mChosung;
}
+ (NSArray *) contactsMatchingName: (NSString *) fname
{
NSPredicate *pred;
NSArray *contacts = [ABContactsHelper contacts];
// Geekboard : 'chosung' key 도 검색하도록 수정
pred = [NSPredicate predicateWithFormat:@"chosung contains[cd] %@ OR firstname contains[cd] %@ OR lastname contains[cd] %@ OR nickname contains[cd] %@ OR middlename contains[cd] %@ ", fname, fname, fname, fname,fname];
return [contacts filteredArrayUsingPredicate:pred];
}
- (void)testExample
{
contacts = [ABContactsHelper contactsMatchingName:@"긱ㅂㄷ"];
STAssertTrue([contacts count] > 0, @"");
}
현재 상태로는 위의 Test 를 통과하지 못합니다. ( 초성 + 일반 글자 혼용 형태)
- (void) callWithOpenURL:(NSString *)phoneNumber {
NSURL *url = [NSURL URLWithString:[@"tel://" stringByAppendingString:phoneNumber]];
[[UIApplication sharedApplication] openURL:url];
}
- (void) callWithWebView:(NSString *)phoneNumber {
NSURL *url = [NSURL URLWithString:[@"tel://" stringByAppendingString:phoneNumber]];
// ! memory leak
UIWebView *callWebview = [[UIWebView alloc] init];
[callWebview loadRequest:[NSURLRequest requestWithURL:url]];
}* 장점 : 전화가 끝나면 현재앱으로 돌아온다.