MacBook(白)(late2006)のHDD換装作業。
確か今回で3度目の交換になる。
80GB > 160GB > 320GB > 750GB
現在、2.5インチで1TBのHDDも出てるけど厚さが合わないので使えない。
9.5mm厚のもので最大容量は750GB、これに換装する。
換装から復元までの今回の手順
1.320GBの内蔵HDDを750GBの新HDDに交換する
2.320GBのを外付けHDDケースに入れる
3.DVDからディスクユーティリティを起動する
4.750GBのにパーティションを作成する
5.パーティションを消去(初期化)する
6.2.の外付けHDDを接続する
7.復元タブを開いて、「復元先を消去」を外す。
8.ソースと復元先を、外付けHDDと内蔵HDDをそれぞれ選択する。
9.復元〜ん。
10.寝て起きたら終わってるはず。
やりかたは色々ある。
80GB > 160GB へ換装したときは rsync を使って復元した。
160GB > 320GB へ換装したときも rsync を使って復元した。
320GB > 750GB へ今回換装するとき、最初はタイムマシンから復元する予定だった。
でも失敗したので今回やった方法で復元した。
後からもう少し調べたところ、タイムマシンからの復元は一度クリーンインストールした後に復元作業にすすむらしい。
みんな好き好きな方法をでやってみればいい。
2011年1月4日火曜日
YYYY じゃなくて yyyy
バグが出るとすれば元日あたりに出るだろうなぁと思ったら出た。
Moneyha ってiPhoneアプリで出た。不具合出た。
レビューは優しさに満ち溢れていたのでとても嬉しかった。
(バグありなのに星4と3を付けてレビューしていただけた。)
Objective-C でのはなし。 Xcode 3.2.5 and iOS SDK 4.2.1 で試してる。
単純な話で、YYYY が間違いだった。 yyyy が正しい。
これだけだとなんなので、調べる過程で出てきた NSDate のポイントをいくつか。
そんな感じで。
YYYY と yyyy の違いはこちらの方のブログに書かれてました。ありがとう。
『NSDateFormatterのYYYY利用時の注意点』
http://d.hatena.ne.jp/mmasashi/20101111/1289489570
Moneyha ってiPhoneアプリで出た。不具合出た。
レビューは優しさに満ち溢れていたのでとても嬉しかった。
(バグありなのに星4と3を付けてレビューしていただけた。)
Objective-C でのはなし。 Xcode 3.2.5 and iOS SDK 4.2.1 で試してる。
単純な話で、YYYY が間違いだった。 yyyy が正しい。
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy"]; // ここを @"YYYY" ってしてた。
これだけだとなんなので、調べる過程で出てきた NSDate のポイントをいくつか。
// とりあえずタイムゾーンを確かめておこうよ
NSLog(@"%@", [NSTimeZone defaultTimeZone]); // Asia/Tokyo (GMT+09:00) offset 32400
// NSLogはタイムゾーン関係ないから注意。
NSLog(@"%@", [NSDate date]);
// もうちょいわかり易く。
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate *d = [formatter dateFromString:@"2011-01-01 00:00:00"]; // d は日本時間だよ
NSLog(@"%@", [formatter stringFromDate:d]); // 当然 2011-01-01 00:00:00
NSLog(@"%@", d); // こっちは? 2010-12-31 15:00:00 +0000 が正解。タイムゾーンは日本じゃなくてグリニッジ標準時。
そんな感じで。
YYYY と yyyy の違いはこちらの方のブログに書かれてました。ありがとう。
『NSDateFormatterのYYYY利用時の注意点』
http://d.hatena.ne.jp/mmasashi/20101111/1289489570
2010年12月14日火曜日
RSS2.0 の pubDate に入ってる日付を NSDate に変換したい。
Objective-C での変換のはなし。 Xcode 3.2.5 and iOS SDK 4.2.1 で試してる。
文字列の日付を NSDate に変換します。
こんな感じで。
EEEを探すのに苦労した。
記号の一覧がまとまってるサイトを探してたけど、見つけられなかった。
EEEが見つかる前は仕方ない、こんな感じにしようと思った。
ついでなので、NSDate から文字列に変換してみる。
文字列の日付を NSDate に変換します。
こんな感じで。
NSString *stringPubDate = @"Tue, 30 Nov 2010 06:54:00 +0000";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss ZZZZ"];
NSDate *pubDate = [formatter dateFromString:stringPubDate];
[formatter release];
NSLog(@"%@", pubDate);
EEEを探すのに苦労した。
記号の一覧がまとまってるサイトを探してたけど、見つけられなかった。
EEEが見つかる前は仕方ない、こんな感じにしようと思った。
NSString *stringPubDate = @"Tue, 30 Nov 2010 06:54:00 +0000";
NSArray *splitDate = [stringPubDate componentsSeparatedByString:@", "];
NSDictionary *weekDict = [NSDictionary dictionaryWithObjectsAndKeys:
@"月", @"Mon",
@"火", @"Tue",
@"水", @"Wed",
@"木", @"Thu",
@"金", @"Fri",
@"土", @"Sat",
@"日", @"Sun",nil];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"dd MMM yyyy HH:mm:ss ZZZZ"];
NSDate *pubDate = [formatter dateFromString:[splitDate objectAtIndex:1]];
[formatter release];
NSLog(@"%@ %@曜日", pubDate, [weekDict objectForKey:[splitDate objectAtIndex:0]]);
ついでなので、NSDate から文字列に変換してみる。
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"Asia/Tokyo"]];
[dateFormatter setDateFormat:@"yyyy年MM月dd日HH時mm分ss秒"];
NSString *stringPubDate = [dateFormatter stringFromDate:pubDate];
[dateFormatter release];
NSLog(@"pubDate [ %@ ] [ %@ ]", pubDate, stringPubDate);
2010年11月30日火曜日
Moneyha 1.0.2 を申請した
昨日の夕方。
iOS SDK 4.2.1 でリビルドしただけのバージョン。
次期バージョンとしていくつか新機能を試していたけど、ちょっと考え直す。
締め日を変更できるようにして欲しいっていうレビューあり。
簡単に対応できるか調べてみる。
iOS SDK 4.2.1 でリビルドしただけのバージョン。
次期バージョンとしていくつか新機能を試していたけど、ちょっと考え直す。
締め日を変更できるようにして欲しいっていうレビューあり。
簡単に対応できるか調べてみる。
設定ファイルをplistで用意しておいて読み書きさせたい
Xcodeに追加したplistファイル。
これをアプリ側で読み書きさせたい。
こうやるっぽい。
・Document ディレクトリーにplistファイルをコピーして使う。
合ってるかわからないが、こうやってみた。
・plistファイルをコピーするDocument ディレクトリへのパスを取得する。
・そのパスにファイルがあるか確認する。
・ない。アプリを初めて起動するときは、ない。
・そのパスのファイルを作成する。(plistファイルをコピーして作成する。)
・以降は作成した(Document ディレクトリにある)ファイルを読み書きする。
こんな感じで。なんとなく。
で、iOSシミュレータの場合のDocumentDirectoryの場所
~/Library/Application Support/iPhone Simulator/バージョン/Applications/ランダムな文字列/Documents/Hoge.plist
これをアプリ側で読み書きさせたい。
こうやるっぽい。
・Document ディレクトリーにplistファイルをコピーして使う。
合ってるかわからないが、こうやってみた。
・plistファイルをコピーするDocument ディレクトリへのパスを取得する。
・そのパスにファイルがあるか確認する。
・ない。アプリを初めて起動するときは、ない。
・そのパスのファイルを作成する。(plistファイルをコピーして作成する。)
・以降は作成した(Document ディレクトリにある)ファイルを読み書きする。
//
// かなーりコードを省略してます。当然ですがコピペしても動きませんよ。
//
@interface HogeAppDelegate : NSObject
{
@private
NSString *filepathToHogePlist_;
}
@property (nonatomic, retain, readonly) NSString *filepathToHogePlist;
- (NSString *)applicationDocumentsDirectory;
@end
//
// かなーりコードを省略してます。当然ですがコピペしても動きませんよ。
//
@implementation HogeAppDelegate
@synthesize filepathToHogePlist = filepathToHogePlist_;
//
// [self applicationDocumentsDirectory] でDocument ディレクトリへのパスが取得できる
//
- (NSString *)applicationDocumentsDirectory
{
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}
//
// アプリを初めて使うときに、plistをコピーしている。
//
// NSArray *hoges = [NSArray arrayWithContentsOfFile:self.filepathToHogePlist];
// とか
// [hogehogehoge writeToFile:self.filepathToHogePlist atomically:YES];
// みたいな感じで処理できるようになる。
//
- (NSString *)filepathToHogePlist
{
if (filepathToHogePlist_!=nil) {
return filepathToHogePlist_;
}
BOOL success;
NSFileManager* fileManager = [NSFileManager defaultManager];
filepathToHogePlist_ = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"Hoge.plist"];
// アプリで用意したファイル(これをDocumentDirectoryにコピーして、以降はコピーしたファイルを読み書きさせる)
success = [fileManager fileExistsAtPath:filepathToHogePlist_];
if (!success)
{
NSBundle* bundle = [NSBundle mainBundle];
NSString* bundlepath = [bundle pathForResource:@"Hoge" ofType:@"plist"];
NSMutableArray *hoges = [NSMutableArray arrayWithContentsOfFile:bundlepath];
[hoges writeToFile:filepathToHogePlist_ atomically:YES];
}
return [filepathToHogePlist_ retain];
}
@end
こんな感じで。なんとなく。
で、iOSシミュレータの場合のDocumentDirectoryの場所
~/Library/Application Support/iPhone Simulator/バージョン/Applications/ランダムな文字列/Documents/Hoge.plist
2010年11月8日月曜日
View-based Application で CoreData を使えるようしたい
新規プロジェクト作成のテンプレートでView-based Applicationを選択してプロジェクトを作成する。Core Dataを使いたいがどうすればいいのか。
Navigation-based Applicationテンプレートを選ぶ場合はCore Dataを使うかどうか選択できるようになってるけど、View-basedではチェックボックスが出てこない。
それならば自分で実装しようということになるのだけれど、うーんうーんって感じになる場合が多いと思うの。
なので手順を書いておく。
Xcode 3.2.4 and iOS SDK 4.1 で試してる。
古いバージョンとか新しいバージョンのこと考えてない。
新規プロジェクトをView-based Applicationを選択して名前をMyCDataとして作成してます。
僕がやったポイント。
1.Frameworksグループを右クリック>追加>既存のフレームワーク>CoreData.frameworkを追加
2.Resourcesグループを右クリック>追加>新規ファイル>DataModelを選択>MyCData.xcdatamodelと名前付けて次へでそのまま完了。
3.MyCData.xcdatamodelにエンティティPersonを追加して、そのプロパティにageとnameを追加。
データ型を
age は Int16
name は String
とした。
4.MyCData.xcdatamodelを選択した状態で、設計>データモデル>モデルバージョンを追加。
MyCData.xcdatamodeldにMyCData.xcdatamodelがバンドルされた形になる。
MyCData.xcdatamodeldの中にxcdatamodelファイルが1つ追加されるけどいらないので削除する。
※この4.をやらないで対応する方法もあるけれどそれは書かない。将来的にモデルの変更(プロパティの追加など)がされる可能性を考えれならこれやっとけばいいじゃん、必要になるでしょってことで。
5.エンティティPersonを選択した状態でファイル追加をするとManaged Object Classが選べるので、そのまま完了するとPerson.h/.mが追加される。
6.おまじないコード
7.後は普通にコード書く
8.データの読み込みや追加などは、用意したコンテクスト(NSManagedObjectContext)を通じて実行
後このサンプルでは、InterfaceBuilderでMyCDataViewController.xibにボタン2つ追加してそれぞれIBOutletとIBActionを繋げれば動くはず。
Navigation-based Applicationテンプレートを選ぶ場合はCore Dataを使うかどうか選択できるようになってるけど、View-basedではチェックボックスが出てこない。
それならば自分で実装しようということになるのだけれど、うーんうーんって感じになる場合が多いと思うの。
なので手順を書いておく。
Xcode 3.2.4 and iOS SDK 4.1 で試してる。
古いバージョンとか新しいバージョンのこと考えてない。
新規プロジェクトをView-based Applicationを選択して名前をMyCDataとして作成してます。
僕がやったポイント。
- CoreData.frameworkを追加
- DataModel(.xcdatamodel)ファイルを新規作成
- DataModelにエンティティ作ってプロパティを追加
- .xcdatamodelを.xcdatamodeldにバンドル
- Managed Object Class(NSManagedObjectサブクラス)ファイルを新規作成
- おまじないのコード(NSManagedObjectContextなどを用意)
- 後は普通にコード書く
- データの読み込みや追加などは、用意したコンテクスト(NSManagedObjectContext)を通じて実行
1.Frameworksグループを右クリック>追加>既存のフレームワーク>CoreData.frameworkを追加
2.Resourcesグループを右クリック>追加>新規ファイル>DataModelを選択>MyCData.xcdatamodelと名前付けて次へでそのまま完了。
3.MyCData.xcdatamodelにエンティティPersonを追加して、そのプロパティにageとnameを追加。
データ型を
age は Int16
name は String
とした。
4.MyCData.xcdatamodelを選択した状態で、設計>データモデル>モデルバージョンを追加。
MyCData.xcdatamodeldにMyCData.xcdatamodelがバンドルされた形になる。
MyCData.xcdatamodeldの中にxcdatamodelファイルが1つ追加されるけどいらないので削除する。
※この4.をやらないで対応する方法もあるけれどそれは書かない。将来的にモデルの変更(プロパティの追加など)がされる可能性を考えれならこれやっとけばいいじゃん、必要になるでしょってことで。
5.エンティティPersonを選択した状態でファイル追加をするとManaged Object Classが選べるので、そのまま完了するとPerson.h/.mが追加される。
//
// Person.h
//
#import <CoreData/CoreData.h>
@interface Person : NSManagedObject
{
}
@property (nonatomic, retain) NSNumber * age;
@property (nonatomic, retain) NSString * name;
@end
//
// Person.m
//
#import "Person.h"
@implementation Person
@dynamic age;
@dynamic name;
@end
6.おまじないコード
//
// MyCDataAppDelegate.h
//
#import <UIKit/UIKit.h>
// ここ追加
#import <CoreData/CoreData.h>
@class MyCDataViewController;
@interface MyCDataAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
MyCDataViewController *viewController;
// ここ追加
@private
NSManagedObjectContext *managedObjectContext_;
NSManagedObjectModel *managedObjectModel_;
NSPersistentStoreCoordinator *persistentStoreCoordinator_;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet MyCDataViewController *viewController;
// ここ追加
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
// ここ追加
- (NSString *)applicationDocumentsDirectory;
@end
//
// MyCDataAppDelegate.m
//
#import "MyCDataAppDelegate.h"
#import "MyCDataViewController.h"
@implementation MyCDataAppDelegate
@synthesize window;
@synthesize viewController;
#pragma mark -
#pragma mark Application lifecycle
/**
これ追加
*/
- (void)awakeFromNib {
viewController.managedObjectContext = self.managedObjectContext;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[window addSubview:viewController.view];
[window makeKeyAndVisible];
return YES;
}
- (void)applicationWillResignActive:(UIApplication *)application {
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
}
- (void)applicationWillTerminate:(UIApplication *)application {
}
#pragma mark -
#pragma mark Memory management
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
}
- (void)dealloc {
[viewController release];
[window release];
[super dealloc];
}
#pragma mark -
#pragma mark Core Data stack
/**
これ追加(ゲッター)
CoreData用に共通のContextを1つここで用意する。
SQLiteファイルへの永続ストアコーディネータ(NSPersistentStoreCoordinator)のインスタンスを、用意したContextにセットする。
*/
- (NSManagedObjectContext *)managedObjectContext {
if (managedObjectContext_ != nil) {
return managedObjectContext_;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
managedObjectContext_ = [[NSManagedObjectContext alloc] init];
[managedObjectContext_ setPersistentStoreCoordinator:coordinator];
}
return managedObjectContext_;
}
/**
これ追加(ゲッター)
.xcdatamodeld (.xcdatamodelを内包した)バンドルを指定する。
管理オブジェクトモデル(NSManagedObjectModel)の準備をする。
この管理オブジェクトモデルを使うことで、管理オブジェクト(アプリ側)とレコード(データベース側)とのマッピングさせる。
*/
- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel_ != nil) {
return managedObjectModel_;
}
NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"MyCData" ofType:@"momd"];
NSLog(@"データモデルのバンドルディレクトリ(?)のパス %@", modelPath);
NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return managedObjectModel_;
}
/**
これ追加(ゲッター)
永続ストアとしてSQLite(ファイル)を指定する。
この永続ストアコーディネータを使うことで、管理オブジェクトモデル(.xcdatamodel)と永続ストアを関連付けて管理できるようになる。
*/
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator_ != nil) {
return persistentStoreCoordinator_;
}
NSURL *storeURL = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"MyCData.sqlite"]];
NSError *error = nil;
persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return persistentStoreCoordinator_;
}
#pragma mark -
#pragma mark Application's Documents directory
/**
これ追加
Returns the path to the application's Documents directory.
*/
- (NSString *)applicationDocumentsDirectory {
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}
@end
7.後は普通にコード書く
8.データの読み込みや追加などは、用意したコンテクスト(NSManagedObjectContext)を通じて実行
//
// MyCDataViewController.h
//
#import <UIKit/UIKit.h>
// ここ追加
#import <CoreData/CoreData.h>
@interface MyCDataViewController : UIViewController {
// ここ追加
NSFetchedResultsController *fetchedResultsController_;
NSManagedObjectContext *managedObjectContext_;
// ここ追加
IBOutlet UIButton *addButton;
IBOutlet UIButton *requestButton;
NSMutableArray *persons;
}
// ここ追加
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
// ここ追加
@property (nonatomic, retain) IBOutlet UIButton *addButton;
@property (nonatomic, retain) IBOutlet UIButton *requestButton;
@property (nonatomic, retain) NSMutableArray *persons;
- (IBAction)addPerson:(id)sender;
- (IBAction)requestPersons:(id)sender;
@end
//
// MyCDataViewController.m
//
#import "MyCDataViewController.h"
// ここ追加
#import "Person.h"
@implementation MyCDataViewController
// ここ追加
@synthesize fetchedResultsController = fetchedResultsController_;
@synthesize managedObjectContext = managedObjectContext_;
@synthesize addButton;
@synthesize requestButton;
@synthesize persons;
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
- (void)viewDidUnload {
// ここ追加
self.addButton = nil;
self.requestButton = nil;
}
- (void)dealloc {
// ここ追加
[addButton release];
[requestButton release];
[persons release];
// ここ追加
[fetchedResultsController_ release];
[managedObjectContext_ release];
[super dealloc];
}
/**
これ追加
*/
- (IBAction)addPerson:(id)sender
{
NSLog(@"- (IBAction)addPerson:(id)sender");
NSManagedObjectContext *context = self.managedObjectContext;
Person *person = (Person *)[NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];
[person setAge:[NSNumber numberWithInt:37]];
[person setName:@"Jack"];
NSError *error;
if (![context save:&error]) {
NSLog(@"Error");
}
}
/**
これ追加
*/
- (IBAction)requestPersons:(id)sender
{
NSLog(@"- (IBAction)requestPersons:(id)sender");
NSManagedObjectContext *context = self.managedObjectContext;
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:context];
[request setEntity:entity];
// ソート
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
[sortDescriptor release];
[sortDescriptors release];
NSError *error;
NSMutableArray *mutableFetchResults = [[context executeFetchRequest:request error:&error] mutableCopy];
if (mutableFetchResults == nil) {
NSLog(@"no results");
}
[self setPersons:mutableFetchResults];
[mutableFetchResults release];
[request release];
for (Person *person in persons) {
NSLog(@"%@", [person name]);
}
}
@end
後このサンプルでは、InterfaceBuilderでMyCDataViewController.xibにボタン2つ追加してそれぞれIBOutletとIBActionを繋げれば動くはず。
登録:
投稿 (Atom)