2012年6月26日火曜日

ファイル名一括変換だと?

Name Managerというのが便利だとどこかの記事に書いてあった。

http://manytricks.com/namemangler/

用途はわからないが…メモ。

Macの画像一括サイズ変換


試してみる…ResizeIt







イメージファイルのサイズを一括で変更するソフトです。ついでにファイルのフォーマットを変換します。
マルチコアに対応していますので、複数のイメージをまとめて変換する作業が非常に高速です。またイメージを一度に複数の設定で変換することもできます。


http://itunes.apple.com/jp/app/resizeit/id416280139?mt=12

2012年6月22日金曜日

無線ルーターがよく切れる時の対応

FONルーターがあまりにもお馬鹿になり、やむなくロジテックの無線ルーターを購入。ハイパワーだけど3千円台で買える時代なのにびっくり…。

ちなみに無線ルーターここ10年で3台目。そんなに壊れるものなのか?

さて…そんな無線ルーターだが、つながるけど、しばらくすると通信できなくなる…。
なのでルーターの電源を入れ直すと復活する…。さすがにこの回数が増えてくるとイライラ…。マニュアル見て対応しても治らない。
(電源を抜いて1時間放置とか…書いてある)

http://192.168.2.1/ にアクセスしてID,PWを入れてログイン。
詳細設定 > 無線LAN設定 > 基本設定
ここのチャンネルが、Autoだったものを他の数字に変更すると直るらしい。
1〜13のどれにするか…。
今のところこれで機嫌良くつながっている。
様子を2〜3日見て、調子悪ければ、他の番号に設定するのだとか…。

アプリに外部フォント(*.ttf)を組み込む方法

こちらのサイトからメモ。
出所:http://araking56.blog134.fc2.com/blog-entry-185.html

XCode(Interface Builder)から選択できるフォントは意外と少ない。特に、日本語フォントともなると殆ど選択肢が限られてくる。そこで今回は、ttf拡張子の外部フォントをアプリに組み込む方法を紹介する。

サンプルとして、フリーフォントである「あんずもじ」を利用してみた。
あんずもじ
もちろん他のフォントでも構わないが、フォントのライセンス規約は意外と厳しいので注意が必要。例えフリーフォンとであっても、多くは商用利用を禁止していたり、別途ライセンス料が必要だったりする。(商用利用の定義もそれぞれ異なる)

フォントの準備が出来たら、以下の手順に従ってフォントを組み込む。

(1)プロジェクトにフォントファイルを追加

XCodeにフォントファイル(*.ttf)を追加する。以下の例では、「Resource」グループを作成してその中に追加したが、プロジェクト内であれば別にどこでも構わない。

font-project.jpg

(2)プロパティリストにフォントファイル名を登録

上記(1)で追加したフォントのファイル名をプロパティリスト(*.plist)に登録する。
まず、プロパティリストを表示して、右クリック→「Add Row」で「Fonts provided by application」というキーを追加。そして、追加したキーのアイテムにファイル名を設定する。あんずもじの場合は「APJapanesefont.ttf」となる。

font-plist.jpg

(3)ラベルやボタンのインスタンスにフォントを設定

外部フォントの設定は、Interface Builder(StoryBoard)から行うことが出来ないため、プログラムから設定する。ビューのロード時(viewDidLoad)等に以下のようなコードを記述する。


[label setFont:[UIFont fontWithName:@"APJapanesefont" size:24]];
[button.titleLabel setFont:[UIFont fontWithName:@"APJapanesefont" size:24]];

※labelはUILabelのインスタンス、buttonはUIButtonのインスタンスとする。

UIButtonのsetFontメソッドやfontプロパティは、IOS4.0以降から非公開(非推奨?)となっているようなので、ボタンコントロールにフォントを設定する場合は、titleLabelプロパティに対してフォント設定を行う必要がある。

最後に、プログラムを実行してフォントが正しく設定されていることを確認する。

font-screen.jpg

この例では、2段目のラベルと4段目のボタンに対してあんずもじを設定している。特徴的なフォントなので、システムフォントとの違いは一目瞭然。できれば、標準フォントにもこういった文字を追加して欲しいところ。。

最後に注意事項を1点。プログラムに全てのフォントを組み込むことになるので、使っている文字数に関わらずバイナリのサイズが膨れ上がる。フォントを変更するだけのシンプルなプログラムでも、バイナリ(*.app)のサイズは5.7MBになった。アプリケーションのサイズが20MBを超えると、3G回線によるダウンロードができなくなるため、アプリ利用者の事を考えると注意が必要となる。

ちなみに、実行時のメモリ使用量も増えるのかな?と思ったけど、そんなことはなさそう。外部フォントの組み込み有無に関わらず1MB前後を推移していた。

NSDateFormatter - 文字列と日付の変換

よく忘れるのでこちらもメモ…。

フォーマットの指定

文字列 intputDateStr を inputDateFormatter で指定したフォーマットでパースしてNSDate に格納。それを outputDateFormatter で指定したフォーマットで文字列として出力するサンプル。
 NSDateFormatter *inputDateFormatter = [[NSDateFormatter alloc] init];
 [inputDateFormatter setDateFormat:@"yyyy/MM/dd HH:mm:ss"];
 NSString *intputDateStr = @"2000/01/02 03:04:05";
 NSDate *inputDate = [inputDateFormatter dateFromString:intputDateStr];
 
 NSDateFormatter *outputDateFormatter = [[NSDateFormatter alloc] init];
 NSString *outputDateFormatterStr = @"yyyy/MM/dd HH:mm:ss";
 [outputDateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"JST"]];
 [outputDateFormatter setDateFormat:outputDateFormatterStr];
 NSString *outputDateStr = [outputDateFormatter stringFromDate:inputDate];
 NSLog(@"[in]%@ -> [out]%@(%@)", intputDateStr, outputDateStr, outputDateFormatterStr);
 [inputDateFormatter release];
 [outputDateFormatter release];
outputDateFormatterStrの文字列を変更(出力フォーマットを指定)する事により以下の様な出力が可能。
フォーマットの指定入力出力説明
yyyy/MM/dd HH:mm:ss2000/01/02 03:04:052000/01/02 03:04:05全てをゼロ埋め有りで出力。
yyyy/M/d H:m:s2000/01/02 03:04:052000/1/2 3:4:5月・日・時・分・秒のゼロ埋め無し。
yyyy/M/d H:m:s2000/11/22 13:44:552000/11/22 13:44:55もちろん、2桁のデータが入力された場合は2桁の出力に成ります。

タイムゾーン

フォーマットの指定入力出力説明
yyyy/M/d H:m:s z2000/01/02 03:04:052000/1/2 3:4:5 JSTzでタイムゾーンの出力が出来ます。
z zz zzz zzzz2000/01/02 03:04:05JST JST JST 日本標準時zが1~3つのときは英語の大文字の省略されたもの(日本だと3文字ですが国により常に4文字の場合も有ります)。zが4つの場合は詳細な説明文となります。
Z ZZ ZZZ ZZZZ2000/01/02 03:04:05+0900 +0900 +0900 GMT+09:00Zが1~3つのときは世界標準時からの差(日本の場合は+9時間)。Zが4つの場合は GMT に時差を加えたものになります。
JSTなどの省略された文字列については以下を参照下さい。
標準時 - Wikipedia
タイムゾーンを JST から PST に変更すると以下の様に成ります。
フォーマットの指定入力出力
yyyy/M/d H:m:s z2000/01/02 03:04:052000/1/1 10:4:5 GMT-08:00
z zz zzz zzzz2000/01/02 03:04:05GMT-08:00 GMT-08:00 GMT-08:00 アメリカ太平洋標準時
Z ZZ ZZZ ZZZZ2000/01/02 03:04:05-0800 -0800 -0800 GMT-08:00

Locale(地域指定)をUSにする

Localeの設定次第でも結果が異なります。
例えばLocaleをUSにしたい場合。プログラムは以下の様に記述します。
 NSDateFormatter *inputDateFormatter = [[NSDateFormatter alloc] init];
 [inputDateFormatter setDateFormat:@"yyyy/MM/dd HH:mm:ss"];
 NSString *intputDateStr = @"2000/01/02 03:04:05";
 NSDate *inputDate = [inputDateFormatter dateFromString:intputDateStr];
 
 NSDateFormatter *outputDateFormatter = [[NSDateFormatter alloc] init];
 NSString *outputDateFormatterStr = @"z zz zzz zzzz";
 [outputDateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease]];
 [outputDateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"PST"]];
 [outputDateFormatter setDateFormat:outputDateFormatterStr];
 NSString *outputDateStr = [outputDateFormatter stringFromDate:inputDate];
 NSLog(@"|%@|%@ -> %@||", outputDateFormatterStr, intputDateStr, outputDateStr);
 [inputDateFormatter release];
 [outputDateFormatter release];
localeの設定は以下の部分で行っています。
 [outputDateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease]];
zzzz のときの文字列がアメリカ向けのもになっている事が確認できます。ちなみに日本に設定する場合は ja_JP となります。
フォーマットの指定入力出力
z zz zzz zzzz2000/01/02 03:04:05PST PST PST Pacific Standard Time
iPhoneの現在の設定に合わせる場合は以下の様に記述します。
iPhoneの設定を変える場合は「設定」アプリの「一般」-「言語環境」-「言語」。
 [outputDateFormatter setLocale:[NSLocale currentLocale]];

タイムゾーン

例えば以下の様なプログラムを書いた場合、LocaleはデフォルトではiPhoneに設定されているタイムゾーンが使用されます。
 NSDateFormatter *inputDateFormatter = [[NSDateFormatter alloc] init];
 NSString *inputDateStr = @"yyyy/MM/dd HH:mm:ss";
 [inputDateFormatter setDateFormat:inputDateStr];
 NSString *intputDateStr = @"2000/01/02 03:04:05";
 NSDate *inputDate = [inputDateFormatter dateFromString:intputDateStr];
 NSLog(@"%@ -> %@", inputDateStr, [inputDate description]);
 [inputDateFormatter release];
そのため日本の設定でこのプログラムを実行すると明示的な記述が無いタイムゾーンについては自動的に日本のタイムゾーンで有る、+9時間に設定されます。
iPhoneの設定を変える場合は「設定」アプリの「一般」-「日時と時刻」-「時間帯」。
2000/01/02 03:04:05 -> 2000-01-02 03:04:05 +0900
iPhoneの設定を「太平洋標準時(米国、パシフィカ/Pacifica, USA)」に変更した後にプログラムを実行すると以下の様に出力されます。
2000/01/02 03:04:05 -> 2000-01-02 03:04:05 -0800
太平洋標準時の-8時間が設定されているのが確認できます。
次にタイムゾーンを日本(日本、東京/Tokyo, Japan)に設定し、以下のプログラムを実行します。
 NSDateFormatter *inputDateFormatter = [[NSDateFormatter alloc] init];
 NSString *inputDateStr = @"yyyy/MM/dd HH:mm:ss Z";
 [inputDateFormatter setDateFormat:inputDateStr];
 NSString *intputDateStr = @"2000/01/02 03:04:05 +0800";
 NSDate *inputDate = [inputDateFormatter dateFromString:intputDateStr];
 NSLog(@"%@ -> %@", inputDateStr, [inputDate description]);
 [inputDateFormatter release];
この場合、以下の様になります。
yyyy/MM/dd HH:mm:ss Z -> 2000-01-02 04:04:05 +0900
入力の文字列に指定した時分秒は 03:04:05 ですがタイムゾーンが日本の+9時間より1時間過去である+8時間のタイムゾーンでの日時であるため+9時間のタイムゾーンへの変更が行われた結果、 04:04:05 と1時間進んだ時間に変更されています。
また、Localeの話のところで確認した様にLocaleの設定によりタイムゾーンの記述方法が異なります。
フォーマットの指定Loacleの設定入力出力
z zz zzz zzzz日本2000/01/02 03:04:05GMT-08:00 GMT-08:00 GMT-08:00 アメリカ太平洋標準時
z zz zzz zzzzアメリカ(太平洋標準時)2000/01/02 03:04:05PST PST PST Pacific Standard Time
そのためタイムゾーンを「アメリカ太平洋標準時」と指定する以下の様なプログラムを記述するとLocaleが米国の場合にパースが失敗し、結果が null(nil) と成ります。
 NSDateFormatter *inputDateFormatter = [[NSDateFormatter alloc] init];
 NSString *inputDateStr = @"yyyy/MM/dd HH:mm:ss zzzz";
 [inputDateFormatter setDateFormat:inputDateStr];
 NSString *intputDateStr = @"2000/01/02 03:04:05 Pacific Standard Time";
 NSDate *inputDate;
 
 // Localeが日本
 [inputDateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"ja_JP"] autorelease]];
 inputDate = [inputDateFormatter dateFromString:intputDateStr];
 NSLog(@"[日本]%@ -> %@", inputDateStr, [inputDate description]);

 // Localeが米国
 [inputDateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease]];
 inputDate = [inputDateFormatter dateFromString:intputDateStr];
 NSLog(@"[米国]%@ -> %@", inputDateStr, [inputDate description]);

 [inputDateFormatter release];
出力結果は以下。
[日本]yyyy/MM/dd HH:mm:ss zzzz -> 2000-01-02 20:04:05 +0900
[米国]yyyy/MM/dd HH:mm:ss zzzz -> (null)
逆に「Pacific Standard Time」と指定するとLocaleが日本の時にパースに失敗します。
[日本]yyyy/MM/dd HH:mm:ss zzzz -> (null)
[米国]yyyy/MM/dd HH:mm:ss zzzz -> 2000-01-02 20:04:05 +0900
この様にLocaleにより、パースに影響が有りますので適切なLocaleを指定した上で dateFromString: を実行しましょう。

24時間設定をOFFの環境での注意点

iPhoneでは時間の表示をユーザが24時間表示と午前/午後の2つのパターンを選択できます。
※「設定」「一般」「日付と時刻」に有る「24時間表示」で設定可能。
この「24時間表示」ですが、OFFのときにLocaleを設定していないとNSDateFormatterでHHを指定しても12時間表示での値が返ってくるようです。
Localeを指定した場合はHHでちゃんと24時間表示で返される様なのでLocaleは常に設定する様にしておきましょう。
詳しくはこちらのサイトに良くまとまっています。
日本語環境では、NSDateFormatterでフォーマットした日付がおかしい - 24/7 twenty-four seven

関連サイト

これで主な用途には問題ないとは思いますがその他のフォーマットについても知っておきたい人は以下のページなどを参照下さい。
UTS #35: Locale Data Markup Language
NSDateFormatter
言語設定も意外と曲者なので以前、こちらのエントリーで解説しました。

エラーを知ると対処が見える?


警告:incomplete implementation

実装されてないメソッドとかがあるぞと言われてるよーだ。

警告:Assigning to 'id<***,***etc>'from incompatible type '〇〇 *const_strong''

.hファイルの@interface 〇〇に<***,***>プロトコルを実装しろ。

警告:unused variable 'variable name'

変数の定義のみで、' 変数名 ' が使われていない。

警告:Local declaration of 'name' hides instance variable

'name'が、クラス変数とメッソド引数で同時に使われています。重複しています。

警告:"IBOutlet"attribute can only be applied to instance variables or properties

”IBOutlet”属性は、インスタンス変数かプロパティとしてだけ適用されます。
@interface{}の中に入っていなかったりすると出る。

警告:property "***"requires method "set***"to be defined - use @synthesize, @dynamic or provide a method implementation

プロパティの***の定義のために、”set***”メッソドが必要です。@synthesizeや@dynamicなどimplementation部分にメソッドを作って下さい。

警告:"***" is deprecated

***は推奨されない記述方法です。iPhone Reference Libraryなどで"***"のサンプルコードを検索して使い方をまねて下さい。

警告:Expression result unused

表現が結果的に使用されていません。必要ありません。

警告: Property '***''retain(or strong)'attribute dose not match the property inherited from 'MKAnnot...'

プロパティ***とリテインもしくはストロング属性は、MKアノテーションから継承しているプロパティと一致しません。

警告:Control reaches end of non-void function

non - void 型関数の最後まで走ったけど。。。
non - void 型関数は値を返す必要がある。

警告: Unsupported Configuration: Plain Style unsupported in a Navigation Item

エラー:Applications are expected to have a root view controller at the end of application launch

Problem on iOS 5 ? 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{   
    //self.window.rootViewController = self.viewController;
    //[self.window makeKeyAndVisible];
    return YES;
}

赤字の部分がどうやらいらないらしい。。。

エラー:cannot declare variable inside @interface or @protocol

@interfaceもしくは@protocolの中で変数が宣言できてません。

エラー:use of undeclared identifier "***"

宣言されていない名前"***"が使われています。

エラー:Property implementation must have its declaration in interface '***'

プロパティを実装するには、その宣言を'***'の@interfaceにして下さい。

エラー:Passing 'UITextField *' to parameter of incompatible type '***'

 'UITextField *'が'***'という非互換型の変数になっています。

エラー:Check dependencies [BEROR]Code Sign error: a valid provisioning profile matching the application's Identifier '***' could not be found

実機でビルド時にIdentifier'***'が見つかりません。→疑ってみるところの1つとして、provisioningファイルは作成、ダウンロード後に、PCにダブルクリックでインストールしているか。していない場合にも、このエラーが出るみたいです。それかXcode設定タブでの、Identifierの名前が一致していないなど。

エラー:CodeSign error: Certificate identity 'iPhone Developer: ***' appears more than once in the keychain. The codesign tool requires there only be one.

キーチェーンにCertificate identity'***'が1つ以上存在します。コードサインツールは、たったひとつのCertificate identityを要求します。→Mac右上の検索より、keyチェーンを検索して選択します。重複しているCertificate identityを消去します。

エラー: interface type cannot be statically allocated

You're probably missing '*' before ...

エラー: Property with 'retain (or strong)' attribute must be of object type

retain もしくは strong 属性のプロパティは、オブジェクトである必要がある。

エラー: 'release' is unavailable : not available in automatic reference counting mode

こちらのサイト:EZ-NETに詳しく書いてあります。

エラー: ARC forbids explicit message of 'release'

こちらのiPhone&Android端末向けのアプリ開発忘備録に詳しく書いてあります。

エラー:the result of a delegate init call must be immediately returned or assign

BP:Thread1:Program received signal:"EXC_ARITHMETIC".

EXC_ARITHMETIC (SIGFPE) is signaled when the CPU detects an invalid calculation. Some causes include divide by zero, integer overflow, etc., and integer divide by zero is most likely the reason since you're implementing a Fraction class.

BP : Thread1:Program received signal:"SIGABRT"

プログラムの異常終了。
解決参考URL → SIGABRT

Couldn't register ○○○○○ with the bootstrap server. Error: unknown error code.
This generally means that another instance of this process was already running or is hung in the debugger.

解決参考URL → iPhoneアプリ開発備忘録

iPhone サウンドIDで音を鳴らす…。

● プロジェクトに AudioToolbox.framework を追加。
● AudioServices.h をインポート(よく忘れる)

#import "RootViewController.h"
#import <AudioToolbox/AudioServices.h>

@implementation RootViewController
- (IBAction)onClick:(id)sender {
    AudioServicesPlaySystemSound(1000);
}
@end


サウンド ID説明
1000Eメール着信
1001Eメール送信
1002SMSやノーティフィケーションの着信(バイブ1回)
1003SMS着信(SMSアプリ内)
1004SMS送信
1005ピポピポ
1006カン♪
10071002と音は同じ(バイブ2回)
1008チリーン
1009トライアングルのような音
1010パフパフ
1011音なしバイブのみ(ブブ〜と振動2回)
10121007と同じ
1013カーン
1014ピポポポポ
10151002と同じ



(参考)
音なしでバイブだけ鳴らしたいのであれば AudioServicesPlayAlertSound 関数を使う
#import "RootViewController.h"
#import <AudioToolbox/AudioServices.h>

@implementation RootViewController
- (IBAction)onClick:(id)sender {
    AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
}
@end

他の人に開発中のアプリを見てもらう方法…。


証明書をつくる。

証明書を作成するにはアップルに証明書の申請ファイルを送らないといけない。その申請ファイルの作成にはキーチェーンアクセスを使用します。キーチェーンアクセスを起動して、メニューの「キーチェーンアクセス」>「証明書アシスタント」>「認証局に証明書を要求」を選択します。

証明書情報に ADC に登録したメールアドレスと名前(コモンネーム)を入力。メールで送信はしないので CA のメールアドレスは空白。「ディスクに保存」と「鍵ペア情報を指定」にチェックを入れる。
証明書情報
証明書情報
鍵ペア情報はデフォルトのままで OK 。「続ける」をクリックすると証明書要求ファイルが作成される。
鍵ペア情報
鍵ペア情報
iPhone Developer Center にログインして、Certificates タブの右上にある [Add Certificates] をクリックして作成した証明書要求ファイルをアップロードする。

証明書を開発するMac にインストール

証明書要求ファイルをアップロード後、しばらくすると Status が [Processing] になりその後 Download ボタンが表示されれば、証明書の作成が完了です。Download ボタンをクリックして証明書をダウンロードします。
ダウンロードした証明書をキーチェーンアクセスにドラッグ&ドロップすれば、証明書の登録は完了です。
キーチェーンに証明書を登録
キーチェーンに証明書を登録

実機テストで使用する iPhone/iPod touch を登録

Xcode のメニュー「ウィンドウ」>「オーガナイザ」を選択。iPhone/iPot touch を接続する。Xcode が iPhone/iPod touch を認識すると DEVICE に表示されるので、Summary タブの Identifier (個体識別番号)をコピー。
Xcode のオーガナイザ
Xcode のオーガナイザ
iPhone Developer Center の Device メニューを選択して、右上にある [Add Device] をクリックして、Device Name , Device ID (上でコピーして個体識別番号)を入力すれば登録完了。

自作アプリの App ID を取得

iPhone Developer Center の App IDs メニューを選択して、右上にある [Add ID] をクリックして、App ID Name , App ID を入力する。App ID Name は自分で好きにつけて OK です。App ID は jp.syuhari.AppName というように他とかぶらないようにつける。
App ID の登録
App ID の登録

プロビジョンプロファイルの作成

iPhone Developer Center の Provisioning メニューを選択して、右上にある [Add Profile] をクリック。Profile Name は自由に決めて OK 。Certificates をチェック、App ID は先ほど作成したものを選択、Device もチェックする。
プロビジョンプロファイルの作成
プロビジョンプロファイルの作成
プロビジョンプロファイルの一覧画面で先ほど作成したプロファイルは最初は Pending になっています。しばらくしてリロードすると Download ボタンが表示されれば作成完了なので、ダウンロードします。

Xcode に AppID と プロファイルを登録

ダウンロードするときに Xcode で開けば登録されます。登録確認は Xcode のオーガナイザを開き、PROVISIONING PROFILES の所に先ほど作成したプロファイルがあれば OK です。
次に Xcode のメニュー「プロジェクト」>「プロジェクト設定を編集」を選択して、プロジェクトの情報を開き、ビルドタブの中にある「Any iPhone OS Device」の値を作成したプロファイルにします。
Xcode でプロファイルを指定
Xcode でプロファイルを指定
info.plist の Bundle identifier を作成した App ID に変更します。
info.plist の Bundle identifier を変更
info.plist の Bundle identifier を変更

自作アプリを実機に転送してテスト

Xcode の左上にあるプルダウンメニューで実行対象をシュミレータから実機に変更して「ビルドして進行」をします。
e38394e382afe38381e383a3-141
左下のステータスを見ているとしばらくすると iPhone/iPod touch に転送されているのが分かります。iPhone/iPod touch は転送されていると上のバーの部分でローディングされているのが分かり、しばらくすると自動的にアプリが実行されます。転送されたアプリは iPhone/iPod touch のホーム画面にアイコンが表示されるので、後は通常のアプリと同じようにいつでも実行できます。
他のアプリを実機でテストする際は App ID の取得からやれば OK です。