2017-02-28

TOHO シネマズ・アプリで Apple Pay 支払いが上手くいかない時の対処方法

iOS の TOHO シネマズは、2017-02-28 現在 Apple Pay に対応している数少ないアプリの一つ。アプリから席の予約・チケットの購入までがシームレスに行なえて便利。

ところがぼくの iPhone 7 Plus でチケットを買おうとすると、Apple Pay の購入 (指絞認証をした直後) で「お支払いを完了できませんでした」というエラーが出る。そこから先に進めない。

TOHO Cinemas & Apple Pay

解決方法

解決方法は次の通り:

  1. Apple Pay の指絞認証画面を出す
  2. 「連絡先」を選択
  3. 「編集」を選択
  4. TOHO シネマズの会員に登録した電話番号を削除する
  5. 「電話番号を追加...」から TOHO シネマズの会員に登録した電話番号を追加する
  6. 追加した電話番号を選ぶ
  7. 完了して、指絞認証を行なう

4. と 5. の手順は無駄なようでいて、実はキモ。「TOHO シネマズの会員に登録した電話番号」を既に入れていても、もう一度追加しないとダメ。

なんでこんなことになってるのか分からない。TOHO シネマズ・アプリがおかしいのか、Apple Pay 側がおかしいのか。。。Apple Pay 対応のアプリって、TOHO シネマズ・アプリ以外使ったことがないのでなんとも言えない。

とりあえず、今はこんな方法でしのぐしかないのかな〜〜。もっと良い解決方法があったら教えてください。

Emacs 25.2 rc2 リリース

Irreal ブログで、Emacs 25.2 rc2 が出たことを知った。

info-gnu-emacs でのアナウンスは 2017-02-21。ちなみに Emacs 25.2 rc1 のアナウンスは 2017-02-03 に出ていた。

Emacs 25.2 の正式リリースまで、もう少しかな。

ref

2017-02-24

2017 年度の音展は 5/13,14 開催

2017 年度の音展 -- OTOTEN -- は、GW 明けの 5/13,14 に開催される。概略は次の通り:

  • 日時: 2017-05-13 (土) 10:00-19:00
    2017-05-14 (日) 10:00-17:00
  • 場所: 東京国際フォーラム
  • OTOTEN

B1F ではカー・オーディオを体験できるようデモ・カーを用意しているとのこと。各階ごとに出展ブースが決まっている:

  • 4F: ヘッドホン・イヤホン・ポータブルオーディオ関連ブース
  • 5F: ホームオーディオ、ホームシアター関連ブース
  • 6F: ハイエンドオーディオ関連ブース
  • 7F: 総合イベントゾーン

気になるのは、5F と 6F。「最新スピーカー 6 機種比較試聴会」というのをやるらしいけど、6F かな? 7F かな? 基調講演は Spotify Japan の社長が「ストリーミングで広がる、オーディオの新たな可能性」というタイトルで話をするらしい。

OTOTEN にはほとんど顔を出したことがなかったのだけど、今年は行ってみようかな!

2017-02-23

Objective-C で文字列を join する

Objective-C で文字列配列の join をやるのは面倒と思っていた。Ruby の join みたいなことが出来ると楽なのにー、と。例えばこんなコード:

%w(This is an apple).join(' ') #=> "This is an apple"

で、Apple のマニュアルを見たらあったcomponentsJoinedByString というメソッド。

これを使えば、NSMutableString を使ったり

NSArray<NSString *> *strings = @[@"This", @"is", @"a", @"pen."];
NSString *separator = @" ";

NSMutableString *mResult1 = [NSMutableString new];
for (int i=0; i<strings.count; ++i) {
    [mResult1 appendString:strings[i]];
    if (i < strings.count - 1) {
        [mResult1 appendString:separator];
    }
}
NSString *result1 = [mResult1 copy];
NSLog(@"Text: %@", result1);

Text: This is a pen.

stringByAppendingString: を使ったり

NSArray<NSString *> *strings = @[@"This", @"is", @"a", @"pen."];
NSString *separator = @" ";

NSString *result2 = @"";
for (int i=0; i<strings.count; ++i) {
    result2 = [result2 stringByAppendingString:strings[i]];
    if (i < strings.count - 1) {
        result2 = [result2 stringByAppendingString:separator];
    }
}
NSLog(@"Text: %@", result2);

Text: This is a pen.

する必要がなくなって、シンプルに書ける。

NSArray<NSString *> *strings = @[@"This", @"is", @"a", @"pen."];
NSString *separator = @" ";

NSString *result = [strings componentsJoinedByString:separator];
NSLog(@"Text: %@", result);

Text: This is a pen.

便利。Objective-C には、意外とユーティリティ的なメソッドも用意されていると知る今日この頃。

オーディオ自宅オフ会 〜 会社の友達を招いて

2017-02-20 (月)、会社のクラシック音楽好きを 2 人招いてオーディオ・オフ会を開いた。

オーディオ・オフ会

1 人は 20:30 頃から、2 人目は 22 時過ぎから参加。23 時頃まで、クラシック音楽やらオーディオやら会社の話で盛り上がった。会社の友人を家に呼ぶのは 14 か月ぶり。先日、プリアンプが修理から戻って来たのが話題になって、今回のオフ会となった。

ポストモーテム

会社上がりでオーディオ・オフ会となると、どうしても開催時間が遅くなる。夕食をどのタイミングで取るか、が悩ましい。外食すれば食事している時間の分だけオフ会の開始が遅れるし、食べなければお腹が空く。コンビニで弁当やお菓子を買のは味気ない。今回は途中でピザハットに寄って、ピザの M を 2 枚買って帰った。ピザはちょっとしたパーティーっぽくなって、会話も弾むし、音楽を聴くのにも邪魔にならない。良い選択だった。3 人で M を 2 枚は多かった気もする。次回は L を 1 枚でも良いかもしれない。ピザ以外だとお寿司の出前 (銀のさらとか) や近所でデリバリーを探してみるのもアリかも。

会社の人だと、オーディオ・オフ会とはいえ必ずしもオーディオの話ばかりじゃなくなる。Philips Hue を家の照明として使っていて、Siri から操作したり、GPS 連携で帰宅したら自動点灯させてる話をした。こういう話は家で実演する方がウケる。ガジェット系では他に Apple TV とか、Kindle Oasis とか、JBL の Bluetooth スピーカーとか、Parrot の Bluetooth ノイズキャンセリング・ヘッドホンとかもネタになりそう。いつでも取り出せるようにしておこう。

せっかく来てもらったので、コーヒーをフレンチ・プレスでいれてみた。いつも 1 人で飲んでいるので、分量が分かりづらかった。というか、3 人分のお湯を沸かせるケトルが無い。コーヒー・グラインダーも 3 人分の豆をひくのは大変だったし。これは... どうしようかね。

肝心のオーディオの音だけど、オフ会終わって聴き直してみたら音が左にズレていた。ある程度セッティングを詰めてはいるつもりだけど、上手くいかない。前日にスピーカー・セッティングを見直した時に、右のスピーカーを 2 cm ほど後ろに下げたのが良くなかった。その時は良かれと思ってやったことなんだけど。後で冷静になってみれば、余計なことをしていたってことがよくある。今回もソレ。自分の音が確立できていないんだろうなぁ。まだまだ未熟。

あとがき

音楽の好きな人を招いてオーディオ・オフ会をやるのも楽しい。またやりたいな!

現在のシステム

ラックは Quadraspire Q4D Vent、CDプレーヤー・プリアンプ間のケーブルは Jorma Design XLR No.2、プリアンプ・パワーアンプ間のケーブルは Jorma Design RCA No.2、スピーカー・ケーブルは Jorma Design No.3。

2017-02-19

Objective-C で 2 つの配列を比べた時同じ要素で最初に見つかったものを返す方法

2 つの配列がを比べて「同じ要素」があるかないか? あるなら、最初に見つかった要素は何か? を調べたいとする。

これを for 文で書くとこんな風に長いコードを書く必要が出てくる (Goto 文を使う是非は置いといて...)。

NSArray *numbers = @[@1, @2, @3, @4, @5, @6];
NSArray *targets = @[@3, @4, @9];

NSNumber *result = nil;
for (NSNumber *n in numbers) {
    for (NSNumber *m in targets) {
        if ([n isEqual:m]) {
            result = n;
            goto objectFound;
        }
    }
}
objectFound:;
NSLog(@"first object: %@", result);

first object: 3

実は Objective-C には、こういう目的に合ったメソッドが用意されている。それが firstObjectCommonWithArray:。これを使って上のコードを書き直すと、for 文が一行にまとめられる:

NSArray *numbers = @[@1, @2, @3, @4, @5, @6];
NSArray *targets = @[@3, @4, @9];

NSNumber *result = [numbers firstObjectCommonWithArray:targets];
NSLog(@"first object: %@", result);

first object: 3

もし見つからなかった場合は nil が返る。便利!

2017-02-18

Apple Music でコンサート用プレイリストを作ってみる

明日、荒川区民会館サンパール荒川で無料のクラシック音楽コンサートがある。曲目は次の通り:

  • ドボルザーク作曲交響曲第8番
  • スッペ作曲軽騎兵序曲
  • イバノビッチ作曲ドナウ川のさざなみ
  • サウンドオブミュージックメドレー

楽しみ。

さて、この手のコンサートがあると曲の予習・復習をするようにしている。これがコンサートによっては自分の知らない曲もあったりする。(今回は有名な曲ばかり。どの曲も CD を持っている。) 今までは CD を持っていない曲は予習なしでコンサートに挑んでいた。

最近は Apple Music (もしくはGoogle Play Music) のお陰で状況が一変した。新作やよっぽどの秘曲でもない限り、たいてい Apple Music に曲がある。なので、予習し損ねることがなくなった。

コンサートの曲目順にプレイリストを作っておくと一気に流すことができる。CD だと (コンサートの曲目順に曲が並んでいることはまずないので) 複数のCD を入れ替えないといけないんだよね。予習にも復習にも便利。コンサートごとにプレイリストを作ってるとゴチャゴチャしちゃうので、ぼくは一年分のプレイリストを作ってる。

2017-02-17

少し古い Git コミットを Zip にまとめる

「不具合の出たコード」が欲しいと言われた。

開発中に難しい不具合が出たので対応している時の話。ヘルプを求めていたら、上のようなリクエストが来た。

諸々の事情で Git のリポジトリーを共有できなかったので、Zip に固めて渡すことにした。けれど、手元のリポジトリーは別のコミットが 3 つくらい入っている。今の修正も stash に入れて作業するのは面倒だし、この前記事にした git worktree を使うほどでもない。

そこで使ったのが git archive コマンド。

$ ​git archive --format=zip コミット・ハッシュ値 > failed.zip

コミット・ハッシュ値は git log で調べた。

コマンド一つで .git ディレクトリーとか無視して欲しいファイルを除いて zip ファイルを作成してくれる。ハッシュ値を指定して、古い状態を直接 zip 化できるのもありがたい。

こういう、ちょい面倒な作業をシンプルにしてくれるコマンドはもっと覚えていきたい。

2017-02-15

Objective-C で NSArray から filter した配列を得る

配列を filter して新しい配列を得たい。Swift で言う所の、次のようなコード。

let array = [1,2,3,4,5,6]
let newArray = array.filter { $0 % 2 == 0 }

Objective-C で書こうとするとループを回すしかないのかな? なんて思ってた。こんな感じに。

NSArray *numbers = @[@1, @2, @3, @4, @5, @6];
NSMutableArray *tmp = [NSMutableArray new];
for (NSNumber *n in numbers) {
    if (n.integerValue %2 == 0) {
        [tmp addObject:n];
    }
}
NSArray *newArray = [tmp copy];
NSLog(@"even numbers: %@", newArray);
even numbers: (
    2,
    4,
    6
)

そしたら filteredArrayUsingPredicate: というメソッドがあることを知った。上のコードは次のように書ける。

NSArray *numbers = @[@1, @2, @3, @4, @5, @6];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"modulus:by:(SELF, 2) == 0"];
NSArray *evenNumbers = [numbers filteredArrayUsingPredicate:predicate];
NSLog(@"even numbers: %@", evenNumbers);
even numbers: (
    2,
    4,
    6
)

7 行のコードがたったの 2 行になった。頑張れば 1 行でも書けそう。

Swift ほどのシンプルさはないし、NSPredicate を使いこなせないといけないけれど、極めれば便利に使えそう。

modulus:by: は NSExpression.h の中に載っていた。

2017-02-14

AMN 10 周年感謝飲み会に参加してきた

昨日、AMN の 10 周年感謝飲み会があったので参加してきた。

  • 日時: 2017-02-13 (月) 19:30-22:00
  • 場所: AMN 会議室

会社を出たのが 19 時半頃だったので、開始から約 1 時間遅れて到着。

AMN の場所が分からなくてマップで検索。虎ノ門 33 森ビルの中に入って、フロア・リストを見ると... 4F にあった!

Agile Media Network

エレベーターで 4F へ。AMN の受け付けに白い紙。

Agile Media Network

近づいてみると、10 周年記念の会議室の案内。

AMN 10th Aniv.

中に入ると徳力さんが AMN の歩みを話していた。途中入場なので話も後半。2012 年頃が話題になっていた。最初から聞きたかったなぁー。AMN の話でもある「アンバサダー・プログラム」。これを「アンバサダー」と決めるまでに別の案もあったとか。話し合いの末に (徳力さんの案が敗れて?) アンバサダーに決まったとか。裏話も色々聞けた。

巨大なバームクーヘンも登場。参加者がカメラを取り出す。みんなブロガーなんだなぁ。

巨大バームクーヘン

もちろん、ぼくも。

久しぶりな顔、名前だけしか知らないような人。様々。引っ込みじあんで、あまり声をかけられなかったけど、楽しかった。