1/23/2012

Mac OS Xでパスワード付きzipファイルを作る方法

ターミナルで対象ファイルのzipファイルを作成して、パスワードを付けるという流れで作成する。

1.ターミナルで対象ファイルがある場所まで移動(例:tarouのDesktopにあるhoge.pdf)
$ cd /Users/tarou/Desktop/

2.zipファイルの作成(例:hoge.zipという名前のzipファイルを作成)
$ zip hoge.zip hoge.pdf

3.作成したzipファイルにパスワードを付与(例:パスワードをpassとした場合)
$ zipcloak hoge.zip
Enter password: pass
Verify password: pass

以上、3ステップです。

1/10/2012

iOSシミュレータの画面をスクリーンショットする方法

iOSアプリ画面のスクリーンショットは起動画像やスタートガイドなので
よく使われる。実機の画面をコピーしてもよいが、iOSシミュレータの画面を
使うほうが勝手が良い。
なぜなら、iOSシミュレータのデバイスを切り替えることで、Retinaのそれも
コピー出来るからだ。
  1. Ctrl+Cmd+Cで画面コピー(メニューからも可能)
  2. プレビュー.appを起動
  3. Cmd+Nでコピー画像を貼り付ける。
以上の手順で作成する。

iPhoneのLaunch名:Default.png
iPhone(Retina)のLaunch名:Default@2x.png
iPad(Portrait)のLaunch名:Default-Portrait~ipad.png
iPad(Landscape)のLaunch名:Default-Landscape~ipad.png

Launch画像を作る上で注意すべきはiPadの画面サイズ
コピーされた画像は768×1024なので、これを
748×1024と1004×768にしなければならない。

Photoshopなどで加工しよう。

9/26/2011

iOSデバイスを判定するSnippet

主にiPadなのかそれ以外なのかを判定するのに使っている。


BOOL isPad = [[UIDevice currentDevice]userInterfaceIdiom] == UIUserInterfaceIdiomPad;
if (isPad) {
} else {
}

読み込むnibファイルを切り替えたり
NSString *nibName = [[UIDevice currentDevice]userInterfaceIdiom] == UIUserInterfaceIdiomPad ? @"viewController_iPad" : @"viewController_iPhone";
UIViewController *viewController = [[UIViewController alloc]initWithNibName:nibName bundle:nil];

短縮URLを作るNSString (shortURL) カテゴリ

昨日の短縮URLを展開するNSString (expandURL) カテゴリと対となるカテゴリ。
Bitly APIを使用しているので、事前にBitlyのアカウントとAPIキーを取得しておく必要がある。また、JSON形式の返り値をNSDictionaryに変換するためにSBJSONを使用している。


NSString+shortURL.h
#import <Foundation/NSString.h>

@interface NSString (shortURL)
+ (NSString *)shortURL:(NSString *)longUrl;
@end

NSString+shortURL.m
#import "NSString+shortURL.h"
#import "SBJson.h"

static NSString *kBitlyWrapperString = @"http://api.bit.ly/shorten?version=2.0.1&format=json&longUrl=";
static NSString *kBitlyFootterString = @"&login=ログイン名&apiKey=APIキー";

@implementation NSString (shortURL)

+ (NSString *)shortURL:(NSString *)longUrl{
NSString *aaa = nil;
NSString *escapeStr = (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)longUrl, NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8);
NSString *str = [NSString stringWithFormat:@"%@%@%@",kBitlyWrapperString,escapeStr,kBitlyFootterString];
NSURL *url = [NSURL URLWithString:str];
NSData *data = [NSData dataWithContentsOfURL:url];
if (data) {
NSString *tempStr = [[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]autorelease];
NSDictionary *aDic = [tempStr JSONValue];
NSLog(@"%@",[aDic description]);
NSNumber *errorCode = [aDic objectForKey:@"errorCode"];
NSString *statusCode = [aDic objectForKey:@"statusCode"];
if ([errorCode intValue] == 0 && [statusCode isEqualToString:@"OK"]) {
NSDictionary *results = [[aDic objectForKey:@"results"]objectForKey:longUrl];
NSString *shortUrl = [results objectForKey:@"shortUrl"];
aaa = shortUrl;
} else {
aaa = longUrl;
}
} else {
aaa = longUrl;
}
return aaa;
}

@end

9/25/2011

短縮URLを展開するNSString (expandURL) カテゴリ

短縮URLを見ない日はなくなった。
Twitterなどは自前でt.coなる短縮URLを用意して悪意のある短縮URLからユーザーを守ろうという試みも行われている。また、アクセスの解析も行われているようだ。

iOSアプリケーションを開発する上では、短縮URLを展開して元URLのURLスキームを解析することにより、UIApplicationの-(BOOL)OpenURL:(NSURL *)メソッドを使用するか否かの判断が可能になる。
これを使用するとSafariやその他の外部アプリケーションが起動されるため、ユーザーが自前のアプリケーションから離れてしまうからだ。

この短縮URLを展開してくれるAPIが幾つか存在するので、その中の2つを使ってNSStringのカテゴリとしてまとめてみた。

APIが返す値はJSON形式で返ってくるものを選び、SBJSONを利用してNSDictionary形式に変換、後続の処理を行なっている。失敗した場合は展開前の短縮URLが返るようにしてある。展開できる短縮URLの種類はAPIに依存しているので注意されたし。またAPIサービスそのものの業務継続性にも注意が必要。

NSString+expandURL.h

#import <Foundation/NSString.h>

@interface NSString (expandURL)
+ (NSString *)expandURL:(NSString *)urlStr;
@end

NSString+expandURL.m

#import "NSString+expandURL.h"
#import "SBJson.h"

@implementation NSString (expandURL)

+ (NSString *)expandURL:(NSString *)urlStr{
NSString *str = nil;
NSURL *url = nil;
NSData *data = nil;
NSString *aaa = nil;
str = [NSString stringWithFormat:@"http://api.unshort.me/?r=%@&t=json",urlStr];
url = [NSURL URLWithString:str];
data = [NSData dataWithContentsOfURL:url];
if (data) {
NSString *result = [[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]autorelease];
NSDictionary *aDic = [result JSONValue];
NSString *status = [aDic objectForKey:@"success"];
if ([status isEqualToString:@"true"]){
aaa = [aDic objectForKey:@"resolvedURL"];
} else {
aaa = urlStr;
}
} else {
str = [NSString stringWithFormat:@"http://expandurl.appspot.com/expand?url=%@",urlStr];
url = [NSURL URLWithString:str];
data = [NSData dataWithContentsOfURL:url];
if (data) {
NSString *result = [[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]autorelease];
NSDictionary *aDic = [result JSONValue];
NSString *status = [aDic objectForKey:@"status"];
if ([status isEqualToString:@"OK"]){
aaa = [aDic objectForKey:@"end_url"];
} else {
aaa = urlStr;
}
} else {
aaa = urlStr;
}
}
return aaa;
}

@end