読者です 読者をやめる 読者になる 読者になる

自宅プログラマーの憂鬱

Since 2013。個人でアプリ作っています。

Apple Search Adsでクレジットカードを登録できない件

結局iフィルターを外したらOKになりました。

f:id:ihatomo:20170218121400p:plain

先日Smart Metronomeをアプデしたのでこれを機にAppleSearch AdsでUSに広告出してみようとトライしました。Apple IDで登録すると、さっそく$100お試しのプロモーションコードの通知メールが届く。でも、クレジットカードの登録が何回やっても、どのカードを使ってもエラー。エラーメッセージは「後で試せ」的な。でも後で試してもダメ。次の日もダメ。
で色々やっていてふと気づいたのだけど、 iフィルター(ウィルスチェック&有害URLフィルタ)を外したらどうだろう? で、これがビンゴ。こんなんで2時間くらいロスしたよ。やれやれ。

アマゾンダッシュボタンの恩恵

f:id:ihatomo:20170119223744p:plain]

うちには3個あります。ダッシュボタン。
これ、何が良いかというと、もちろんトイレットペーパーとかティッシュペーパーとか買い物でかさばるものを家まで届けてくれるというのもあるのだけど、それよりも、「あ、ティッシュ切れてるから買わなきゃ」というタスクがToDo Listに入れることなくボタンひとつで終了することです。少々価格が高い?!ノープロブレム。とにかく日常生活やること多いんだから、こんな瑣末の事に記憶領域と時間を取られることからさっさと開放されたいじゃありませんか。洗剤がないなぁ、、、と思ったらボタンをピっと押せばそれで終わり。なんと気持ちの良いことでしょう。

でも、さすがAmazonというか、「いやいや、近所のスーパーで買った方が安いよ」とか「トイレットペーパーをわざわざ宅配便の方に運送してもらうのは、、」なんていう人をハナから相手にしていません。ダッシュボタンの客層って、食洗機とかルンバとかを買う人に似ていると思うの。家事にとられる時間をお金で解決できるのなら、そしてそれがコスト的に見合うのであれば積極的に導入したいという層が対象。そもそもAmazon Primeの会員のみが対象だし、家にWiFiがあること前提だし、設定にはSmart Phoneにアプリを入れてそこから設定しなければいけないし、情弱の人を相手にしていない。

では、それでAmazonとしてビジネスとして見合うのか?っていうとどうなんでしょう。そこはメーカーさんやクロネコヤマトさんと協力してうまい事ビジネスモデルを構築しているんでしょう。願わくばAmazonの一人勝ちではなく、ビジネスモデルに関わる皆がWinWinである事を願いますがね。クロネコさんの現場は、最近色々大変そうな記事を目にするけど頑張ってサービス継続して欲しいな。

なんで飲食店禁煙ニュースの主役が「業界団体が見直し要望へ」なんだ?

www3.nhk.or.jp

籾井さんが喫煙者だからなのか、飲食店が全面禁煙になることを喜ぶ人の方が大多数のはずなのに、それを問題視する業界団体をクローズアップする報道は一体なんなの?これが国営放送のやることだろうか?!

いやま喫煙率は20%を切っていて、10人に8人は吸わない。しかもこれって成人男女の喫煙率だから、未成年も含めた全人口に換算すると15.9%なわけですよ。

2016年「全国たばこ喫煙者率調査」、男女計で19.3% | JTウェブサイト

このニュースは、国民の大多数である非喫煙者が主役であるべきで、タイトルは、「やっと飲食店が全面禁煙に、これで安心して寿司や焼肉を食べに行ける!」ではないか?!

実際うちでは、家族で外食というのは仕方なく行くもので、子供も全然喜ばない。外食しようにも、あそこはタバコ臭いし、あそこも臭い、、、結局消去法でチェーン店になってしまうから。チェーン店が悪いとは言わないんだけど、最近のチェーン店ってみんなリーゾナボー志向のお店ばっかりだから、どうにも寂しい空気感が漂ってしまう。焼肉とか回転しない寿司とかお好み焼き屋に行きたいのにさ。

働いているおっさんはいいかもしれないよ。取引先や上司が吸うのを我慢するのもサラリーマンの務めと割り切れば。でも、金曜日お父さんたちが飲みに行ってるときに、奥さんが「わたしたちも外食にしちゃおっか」って言うときに安心して子供と行けるお見せがチェーン店しかないって、寂しいじゃないですか。またサ◯ゼかよ~、ってなもんで。

飲食店は禁煙にすると客は増える、しかも良い客が増える。喫煙率と所得には相関関係があって、高得者の喫煙率は、低所得者より低い。だから売上も増える。飲食店が全面禁煙であれば、今まで外食を控えていた高所得者層が繰り出すようになると思うんだけどね。少なくとも私&うちの家族は、そう。この業界団体の見直し要望なんてのは、ミスミス上客を逃す愚行としか思えない。

平成26年「国民健康・栄養調査」の結果 |報道発表資料|厚生労働省
~所得により生活習慣の状況に差、健診の未受診者で健康状態に課題~

というわけで、とりあえずNHKの受信料払うのやめようかな、、。

UIAnimation実行中に画面移動して戻ってくるとAnimationが止まっている件

こんなの基本なんだろうけど、ハマった件。

UIAnimationでVIewを点滅させていたのですが、他のViewをmodalで表示して戻ってくるとAnimatioが止まってしまう。なので、再度VIewDidAppearとかでAnimationを設定するのだけど動かない。はてさて、なぜか?

理由は、わかってみると当たり前で、UIViewを元の状態に戻さないことにありました。以下のコードは、Viewを赤=>白に変化させるAnimationですが、Viewを移動すると赤=>白に変化した状態で画面遷移します。その状態で元のViewに戻ってきてAnimatioを起動しても 白=>白の変化しかしないので、動いていない様に見えるわけ。なので一旦赤に戻す必要があるので、AnimationのComplitionに、元に戻す処理を書きます。

f:id:ihatomo:20161229102400p:plain

- (void)viewDidLoad {
    [super viewDidLoad];
    //ここでは特になにもしない
  }


-(void) viewDidAppear:(BOOL)animated {
    //任意のオプション
    UIViewAnimationOptions myOption =
    UIViewAnimationOptionCurveLinear //等速
    | UIViewAnimationOptionRepeat ; //繰り返し
    //Animation登録
    [UIView animateWithDuration:1.0 // アニメーションの秒数
                          delay:0.0 // 開始までの秒数
                        options:myOption
                     animations:^{
                         _testView.backgroundColor = [UIColor whiteColor]; //プロパティの設定
                     }
                     completion:^(BOOL finished){ _testView.backgroundColor = [UIColor redColor]; }];
    
}

UIDatePickerのCount Down Timer Modeで最初の変更が反映されない [objective-c]

メトロノームのタイマー機能を更新していて、今のTempo表示をそのまま時間として使用する方法から、ピッカーを使うようにしていたところハマりました。UIDatePickerでValue Changedのイヴェントが起きたときのActionを設定したのですが、何と起動して初回だけ、このMethodが呼ばれないのです。

色々と調べたのですが、stackOverFlowなんかではBug扱いされていて、結局初回だけ起動されないのなら、初回はViewDidLoadで設定して、ユーザの変更は2回目以降という事になるようにというのが有効な対処でした。というわけで、viewDidLoadに以下を追加。初期値を0時間1分としたかったので、こうしました。

やれやれ

    NSDateComponents *yourdate = [NSDateComponents new];
    [yourdate setHour:0];
    [yourdate setMinute:1];
    NSCalendar *cal = [NSCalendar currentCalendar];
    NSDate* date = [cal dateFromComponents:yourdate];
    [_datePicker setDate:date animated:YES];

正確なiPhoneのメトロノームアプリについて

ども。ちょっと開発に疲れたので、今日はメトロノームアプリのお話をさせて頂きます。

本日twitterを見ていたら「メトロノームはアプリで済まさず、ちゃんと買え!」みたいなのがあって、ちょっとムッとしたので反論です。信頼できないなどと、おっしゃる方がいらっしゃる。確かにいい加減なのあるのは否定しませんが、ちゃんと選べば正確なのがあるんです。私は、Smart Metoronomeを開発するにあたって50個のメトロノームを評価しましたので、iPhoneメトロノームアプリに関しては日本でも5本の指に入るくらい詳しいと思っています。今日は、その中でも代表的なの6つを選んで計測してみました。

<計測方法>

  • 120BPM
  • Beatが設定できるものは4/4拍子に設定


こんな感じ。

f:id:ihatomo:20161119134350p:plain
(クリックで拡大)

さて、拡大してみてみましょう。まずは3秒後のタイミング。1目盛りが1msです。

f:id:ihatomo:20161119134521p:plain
(クリックで拡大)

上ふたつが、正確で、その下2つは2msほど早いですが、許容範囲でしょう。
もう一箇所、10秒後を拡大してみましょう。同じく1目盛りが1msです。

f:id:ihatomo:20161119134906p:plain
(クリックで拡大)
上の2つは正確ですね。その下2つは5msほど早いですが、許容範囲でしょう。Bのふたつがほとんど同じタイミングでずれているのがわかりますが、これはiPhoneのハードウェアの特性によるものと考えています。Aはそれを補正しています。

私は、メトロノームアプリを正確性だけで分類すると、このABCの3種類に分けられると考えます。

A:正確なもの
B:間隔は一定だけど時間計測にわずかな誤差があるもの
C:揺らぐもの

AとBは、実用上の差異はありませんので、デザインや、使い勝手などでお好きなものを使えば良いと思います。ただ困ったことに、殆んどのメトロノームアプリはCに属しています。テンポ感覚は人それぞれかと思いますが、私は、1/100秒ずれると「あれっ?」って思います。なるべく正確なものを選んで、正しいテンポ感を身に着けたいですね。

尚、プログラムの内部的な話を少ししますと、恐らくAとBは基本的に同じ作りで、一番上のを作った感じだと、どれもハードウェアに直接クリック音を渡しており、時間計測をソフトウェアで行っていないと推測しています。そしてAは、若干それを補正しているだけ。だからBを補正するのは、実は簡単です。Cは、CPUでiPhone内のClockを見に行って、タイミングをとって音を鳴らしていると思われます。なので、CPUのタスク処理状況によって揺らぎが発生してしまいます。

というわけで、電子メトロノームを買うのも良いですが、アプリをバカにするのはやめて下さいね。
で、よかったらこれ使ってください。

AWS SNSにPHPでendPointを追加できない

またもやはまりまくり。
iPhoneへのPUSH通知にAWSSNSを導入していて、endPointの登録にAWS SDK for PHPを使用したのですが、はまりましたので共有します。解決策はこちらを参考にしました。

AWS SDK用のPHPスクリプトは以下で良いはずなのですが、エラーになります。

<?php 
require 'aws.phar';
use Aws\Sns\SnsClient;
 
$sns = SnsClient::factory(array(
            'version' => 'latest',  //これ入れないとエラー吐く
            'key'    => 'アクセスキーを入れる', //アクセスキー
            'secret' => 'シークレットキーを入れる', //シークレットキー
            'region' => 'ap-northeast-1'//地域コード
            ));
 
//デバイス(iPhone等)からデバイストークンを受け取る
$token = $_POST['token'];
 
//Application ARN:Amazon SNS上のAPP ARNを指定
$iOS_AppArn = 'arn:aws:sns:ap-northeast-1:1234567890:app/APNS_SANDBOX/hogehoge';
 
$options = array(
            'PlatformApplicationArn' => $iOS_AppArn,
            'Token' => $token,
            'CustomUserData' => "Test" //User Data
);
 
//エンドポイントをAmazon SNSに登録
$sns->createPlatformEndpoint($options);

?>

実行結果:404 Not Found、アクセスできてない

PHP Fatal error:  Uncaught exception 'Aws\Exception\CredentialsException'
 with message 'Error retrieving credentials from the instance profile metadata
 server. (Client error: `GET http://xxx.xxx.xxx.xxx/latest/meta-data/iam/
security-credentials/` resulted in a `404 Not Found` response:

で、アクセスキーとか、シークレットキーを設定する部分を以下の様に変更。

$sns = SnsClient::factory(array(
            'version' => 'latest', //これ入れないとエラー吐く
            'credentials' => [
                'key'    => 'AccessKey',
                'secret=> 'secret '],
            'region' => 'ap-northeast-1'//地域コード
            ));

これで、無事登録。どうやらパラメータがcredentials配下に下がったみたい。やれやれ。