https://developer.apple.com/ でUDIDを追加したのだけれど、「Automatically manage signing」がONになっている場合に更新する方法が分からなかったのでメモ。
「~/Library/MobileDevice/Provisioning\ Profiles」にあるファイルを消すと、すぐに自動で再作成してくれる。
これで動いたのだけれど、正式な更新方法が分からない、まま。
なんとなく制約を付けて実際の動きを確認して、なんてことをやっていたのですが、ちゃんと仕組みを理解したくて買ったこの本が分かり易かったのでおすすめです。
買ってしばらく経つのですが、やっぱり必要になった時にしか頭に入らないもんですね。
NSPredicateでの正規表現について。その3 » サイキョウライン
ということは、この結果はどういうことなの?どう説明するの?
その2、3の方でコメントをいただいたので、コードを指定して試してみました。(うりかねぐんさんありがとうございます!)
結果は下記の様な感じです。
NSPredicate *p1 = [NSPredicate predicateWithFormat:@"self matches '\\\\u0030'"];
NSLog(@"%@", p1); //=> SELF MATCHES "\\u0030"
NSLog(@"%d", [p1 evaluateWithObject:@"0"]); //=> 1
NSLog(@"%d", [p1 evaluateWithObject:@"0"]); //=> 1
NSLog(@"%d", [p1 evaluateWithObject:@"9"]); //=> 0
NSLog(@"%d", [p1 evaluateWithObject:@"9"]); //=> 0
NSLog(@"%d", [p1 evaluateWithObject:@"A"]); //=> 0
NSLog(@"%d", [p1 evaluateWithObject:@"A"]); //=> 0
NSPredicate *p2 = [NSPredicate predicateWithFormat:@"self matches '\\\\u0039'"];
NSLog(@"%@", p2); //=> SELF MATCHES "\\u0039"
NSLog(@"%d", [p2 evaluateWithObject:@"0"]); //=> 0
NSLog(@"%d", [p2 evaluateWithObject:@"0"]); //=> 0
NSLog(@"%d", [p2 evaluateWithObject:@"9"]); //=> 1
NSLog(@"%d", [p2 evaluateWithObject:@"9"]); //=> 1
NSLog(@"%d", [p2 evaluateWithObject:@"A"]); //=> 0
NSLog(@"%d", [p2 evaluateWithObject:@"A"]); //=> 0
「\u0030」が「0」にも「0」にもマッチしていたり、「\u0039」が「9」にも「9」にもマッチしています。
参考として0と0、9と9のコードはこちらです。
NSLog(@"\\u%04x", [@"0" characterAtIndex:0]); //=> \u0030
NSLog(@"\\u%04x", [@"0" characterAtIndex:0]); //=> \uff10
NSLog(@"\\u%04x", [@"9" characterAtIndex:0]); //=> \u0039
NSLog(@"\\u%04x", [@"9" characterAtIndex:0]); //=> \uff19
サンプルなのでselfとしていたのですが、実際は下記の様に使おうとしていまして、NSPredicateを使わない選択肢がない状態です。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"code matches '.*[^\\\\u0030-\\\\u0039]+?.*"];
NSArray *hoges = [Hoge MR_findAllSortedBy:@"name" ascending:YES withPredicate:predicate];
要はcodeに半角数字以外が混じっているデータを取り出したいだけなんですが、iOS(CoreData?)的にはどうするのが相応しいのでしょうか。
NSPredicateでの正規表現について。その2 » サイキョウライン
え?なんなの?¥dと¥Dは全角半角関係ないの?どこ仕様?それどこ仕様よ?
ってことで、念のため仕様を追ってみました。
Predicate Format String Syntax
MATCHES
The left hand expression equals the right hand expression using a regex-style comparison according to ICU v3 (for more details see the ICU User Guide for Regular Expressions).
ここの「Regular Expressions」に付いてるリンクから、
Regular Expressions – ICU User Guide
\d ✓ ✓ Match any character with the Unicode General Category of Nd (Number, Decimal Digit.)
Regular Expressions – ICU User Guide
\D ✓ ✓ Match any character that is not a decimal digit.
「Unicode General Category of Nd (Number, Decimal Digit.)」ってなに?→ググる。
Unicode Characters in the ‘Number, Decimal Digit’ Category
U+0030 DIGIT ZERO 0
なるほどってことで、それぞれのコードを確認します。
NSLog(@"\\u%04x", [@"0" characterAtIndex:0]); //=> \u0030
NSLog(@"\\u%04x", [@"0" characterAtIndex:0]); //=> \uff10
んー、たしかに別物ですよねぇ。。。えぇ。。。
Unicode Characters in the ‘Number, Decimal Digit’ Category
U+FF10 FULLWIDTH DIGIT ZERO 0
。。。ん?
これもここにあるっていうことは「\d」の解釈は仕様として正しいってこと?「\d」を使ってるのがダメ?
NSPredicate *p1 = [NSPredicate predicateWithFormat:@"self matches '.*[^0-9]+?.*'"];
NSLog(@"%d", [p1 evaluateWithObject:@"1234567"]); //=> 0
NSLog(@"%d", [p1 evaluateWithObject:@"1234567"]); //=> 0
NSPredicate *p2 = [NSPredicate predicateWithFormat:@"self matches '.*[^0-9]+?.*'"];
NSLog(@"%d", [p2 evaluateWithObject:@"1234567"]); //=> 0
NSLog(@"%d", [p2 evaluateWithObject:@"1234567"]); //=> 0
ということは、この結果はどういうことなの?どう説明するの?
えー、だいぶ混乱してまいりました。
NSPredicateでの正規表現について。 » サイキョウライン
自分の理解では万策尽きてしまったので、どなたか教えてください。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self matches '.*\\\\D+?.*'"];
NSLog(@"%d", [predicate evaluateWithObject:@"1234567"]); //=> 0
NSLog(@"%d", [predicate evaluateWithObject:@"#12345"]); //=> 1
NSLog(@"%d", [predicate evaluateWithObject:@"あいうえお"]); //=> 1
NSLog(@"%d", [predicate evaluateWithObject:@"1234A56"]); //=> 1
NSLog(@"%d", [predicate evaluateWithObject:@"1234567"]); //=> 0
某所で指摘していただいて「\\\\D+」→「.*\\\\D+?.*」として解決できそうだったのですが、新たな問題が。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self matches '.*\\\\D+?.*'"];
NSLog(@"%d", [predicate evaluateWithObject:@"1234567"]); //=> 0
NSLog(@"%d", [predicate evaluateWithObject:@"1234567"]); //=> 0
え?なんなの?¥dと¥Dは全角半角関係ないの?どこ仕様?それどこ仕様よ?
自分の理解では万策尽きてしまったので、どなたか教えてください。
Rubyで書くとこのようになる判断(1つめのみfalse)をしたいのですが、思い通りの結果にならなくて悩んでます。
reg = /\D+/
reg =~ '1234567' #=> nil
reg =~ '#12345' #=> 0
reg =~ 'あいうえお' #=> 0
reg =~ '1234A56' #=> 4
Objective-Cではこのように書いているのですが、3つめ以外はNOになります。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self matches '\\\\D+'"];
NSLog(@"%d", [predicate evaluateWithObject:@"1234567"]); //=> 0
NSLog(@"%d", [predicate evaluateWithObject:@"#12345"]); //=> 0
NSLog(@"%d", [predicate evaluateWithObject:@"あいうえお"]); //=> 1
NSLog(@"%d", [predicate evaluateWithObject:@"1234A56"]); //=> 0
Rubyで書いたのと同じ結果にするには、どの様に書いたらいいのでしょうか。
iPhoneやiPadをスリープ解除した時にiTunesやiCloudのパスワードを聞かれることがあって、原因が分からず気持ち悪かったのですが、このツイートを見てふと思いました。
アプリの自動ダウンロードをONにしているので、触ってない間にアプリがアップデートされる→アップデートされたアプリが自動で購入情報(iTunes)や設定情報(iCloud)などを更新しようとする→パスワードを求めるポップアップが出る→スリープ解除したときに気が付く。
これ、じゃないですかね?
せめてなにがアカウント認証を求めているのかは出して欲しい、ホント。
*** Assertion failure in -[UIAlertController addAction:], /SourceCache/UIKit/UIKit-3347.44/UIAlertController.m:121
UIAlertView→UIAlertControllerをやっていて、こんなのが出てしばらくハマったのでメモ。
結論から言うと、styleがUIAlertActionStyleCancelのactionは2つ以上addしてはいけない。
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"タイトル"
message:@"メッセージ"
preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"キャンセル"
style:UIAlertActionStyleCancel
handler:^(UIAlertAction *action) {
// キャンセルなんとか
}]];
[alert addAction:[UIAlertAction actionWithTitle:@"OK"
style:UIAlertActionStyleCancel
handler:^(UIAlertAction *action) {
// OKなんとか
}]];
パッと見で気が付かないよ・・・。
2つめの「UIAlertActionStyleCancel」は「UIAlertActionStyleDefault」か「UIAlertActionStyleDestructive」にしましょう。
アサーションならもうちょっとメッセージに情報が欲しいなぁ。