自宅プログラマーの憂鬱

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

プランジャーミュートはダイソーの排水口クリーナーで

今度、トランペットの演奏でプランジャーミュートを使う曲があったので調達を試みました。プランジャーミュートって何?って方はこちらの2:16 あたりからのMarsalisのSOLOをどうぞ。

www.youtube.com

はい、おトイレのカッポンです。楽譜には + ○ + ○ の様に書かれ ていて、+ はCloseで○がOpen。古くはカトちゃんの「ちょっとだけよ」のトランペットで使われていました。で、楽器メーカーからPlunger Muteって出てるのだけど、4〜5,000円もするし、そもそもMarsalisだってこれって本物のカッポンでしょう。というわけで、100均をまわることに。トイレのやつだと大きいのだけど、ダイソーで丁度いいのを発見。サイズもばっちり、何と言っても色がパステルカラーで清潔感溢れてるところがナイス!写真は水色だけど、薄いグレーもありました。

f:id:ihatomo:20170926233838j:plain

f:id:ihatomo:20170926233913j:plain


ちょっと内側のでっぱりを削るといいみたいですね。トランペットの皆様、お試しあれ。
www.youtube.com

Smart Metronome リピートモードのバグ

すみません、Smart Metronome Version 4.6 にバグを混入させてしまいました。
リピートモードが、小節数、繰返し回数共にカウントアップせずに延々と同じビートを打ってしまいます。現在修正したバージョンをAppleに提出しておりますので、直ぐにアップデート版がリリースとなると思います。ご不便おかけしますが、それまで少々お待ちください。

iOS11でCPU使用率上昇でアニメーション動作不良

f:id:ihatomo:20170921113003p:plain

開発者のみなさん、iOS11対応やってますか?

今回のアップデートで、特にdeprecatedになったコードとかは無かったのですが、何故かメトロノームアプリの針が、ある操作を行うとまともに動かなくなりました。 その操作というのは、メイン画面からプログラム編集画面を出すというもので、その画面を表示するとCPU負荷が異常に上がってしまうのです。それは画面を閉じてもずっと続いて、アプリを落とさないと元に戻らないという恐ろしい事になっていました。

で、色々やってるうちに画面上のUITextFieldにフォーカスを渡すと使用率が落ちることに気づいたので、コードで画面上のTextFieldにフォーカスを渡して、すぐに外すという処理を追加しました。

-(void)viewDidAppear:(BOOL)animated {
    //TextにForcusを当ててすぐに外す
    [_hogeText becomeFirstResponder];
    [_hogeText endEditing:YES];
}

こんなんで解決ですよ。何かスッキリしないけどね。やれやれ。

Wordpress : WP-MembersでTOSのLINK先を変更する

Wordpressで会員サイトを作成する際に大変便利なプラグイン、WP-Members。
新規アカウントを登録する際に利用規約(TOS)にチェックを入れてもらう様にした場合、利用規約のLINK先はプラグイン内のTextフィールドに記入する様になっています。これを、独自の固定フォーマットのページに飛ばしたいときの対策。

ja.wordpress.org

対象File: wp-members/inc/wp-registration.php 及び class-wp-members-forms.php
wp-members-tos.phpに飛んでいる部分を固定ページのLinkに変更。

       } else {
        // **** changed ****
     	// $tos_pop = "<a href=\"#\" onClick=\"window.open('" . WP_PLUGIN_URL . "/wp-members/wp-members-tos.php','mywindow');\">";
           $tos_pop = "<a href=\"利用規約のリンク先を設定\">";
       }

Smart Metronome Ver4.2 リリースしました 今回の目玉はLOG

スマートメトロノームのアップデートができました。

ー 今回の変更点 ー
[新機能]
LOG表示する

[ユーザ要望]
振り子を左から振る
カウントの音量の差を小さくする
拍子とか拍分割の画面を閉じられるようにする
チューニングの音をAだけじゃなくて、色々出せるようにする
カウントの長さ調整

[バグフィックス]
プログラムモードのときはテンキーを起動しない
動いてる時にテンキーでテンポ変えるとバカになる
メトロノームエンジンの記法変更 (Deprecated対応)

です。もちろん目玉はLOG表示で、プリセットした曲名ごとにどれだけ練習したか記録します。メトロノームを動かしていなくても時間は計測するようにしましたので、曲名だけセットしてメトロノームを止めていてもLOGが残ります。なので、日々の練習量の記録にもお使い頂けることと思います。

これで、一通りのやりたい事は盛り込んだかな。ふぅ。

adMobのバナー広告の更新時間をGoogle先生に最適化してもらった件

いつからできたのか、数日前にひょろっとGoogle先生から件名の設定を勧められたので早速やってみた。

adMobの "収益化" => アプリを選択 => 広告ユニットを選択 そうすると設定画面になるので、自動更新の項目を"Google による最適化"を選択。内容は以下の通り。

Google により最適化された自動更新の頻度を使用することをおすすめします。これにより、過去の AdMob データに基づいて最適な更新頻度が算出され、広告ユニットに表示される広告がバナー広告に最も適した頻度で更新されるようになります。

カスタムの更新頻度を 30~120 秒の間隔で設定することや、更新頻度を完全に無効にすることもできます。

何と心強いんでしょう。で、さっそく設定してみたところ今まで(40秒)の10倍以上の更新頻度になっちゃいました。もう全然広告が変わらないの。こんなんで大丈夫かな?、、、と思ったら体感的にパフォーマンスが1割くらい改善している気がする。体感的にというのは、表示時間が変わるだけで色々な数字が一度に変化しちゃうからよくわからなくて、しかも3月と4月っていうのも随分違うからきちんと比較できないの。でも、しばらくこの設定で行こうと思います。

2つのNSDate型データの年月日だけを比較する

まーだ Objective-Cでプログラミングしてんのかよ!?って感もありますが、、、
既存のAPP、既に8000行くらい書いちゃってるし、Swiftに移行するモチベーションも無いんですよねー。

ところで、軽くハマったんですが、別のタイミングで取得されたNSDate型のデータで、時間は関係なく同じ年月日なのかどうか?だけを比較するのに NSCalendarの componentsを使ってみました。が、、、違う日なのに同じって判定するんで「おかしいなぁ、」と思ったら、、、

誤)
dateCompos1.date == dateCompos2.date

正)
dateCompos1.day == dateCompos2.day

でした。dateってやってもエラーにはならないんですけど空っぽなので常に正になっちゃいます。やれやれ。

-(BOOL) isYMDSame : (NSDate *) date1 : (NSDate *) date2 {
    //NSDateから年月日を取得する
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *dateCompos1 = [calendar components:
                                NSCalendarUnitYear |
                                NSCalendarUnitMonth |
                                NSCalendarUnitDay
                                fromDate:date1];

    NSDateComponents *dateCompos2 = [calendar components:
                                NSCalendarUnitYear |
                                NSCalendarUnitMonth |
                                NSCalendarUnitDay
                                fromDate:date2];
    
    if (dateCompos1.year == dateCompos2.year &&
        dateCompos1.month == dateCompos2.month &&
        dateCompos1.day == dateCompos2.day) {
        return YES;
    } else {
        return NO;
    }
}