iPad用電子楽譜アプリを作り始めました
なんと 9年ぶりのブログ記事ですw
ピアノ演奏のためにiPad で電子楽譜のアプリを幾つか使っています。
最初は PiaScore から始め、いまは Newzik をメインで使っています。 PiaScore はまぁまぁ良かったのですが、iPadデバイス間で楽譜が同期できないのが我慢できず、Newzik に移行しました。 Newzik はクラウドで楽譜が同期できるので良いです。
本当は iPad 2台使って見開き表示したいのですが、PiaScore / Newzik どちらもできません。 いろいろ探した限りでは、これができるのは forScore と forScore/Cue の組み合わせだけですね。
ただこれは WiFi 接続が必須なので、自宅で使う分には良いのですが、演奏会では使えないです。 テザリングすればできるのですが、演奏前にそんなのセットアップしてる余裕ないし、演奏中に切れたりしたら目も当てられない。
ということで自分のニーズに完全に合致するものがなさそうなく、自分で作るしかなさそうなので、試作を始めました。
要件
自分にとって必要な要件は以下。
1) 譜めくりペダルを離したときにページめくりできること
既存アプリはすべてペダルを踏んだ瞬間にページがめくられるようになっていて、離したときにめくるようになっていません。
これだと、ページめくりをするちょっと前に左足をペダルの上に移動して浮かせておかないといけません。これがやりにくい。 離したときにめくるようになっていれば、先にペダルを雑に踏んでおいて、めくりたいときに離せばいいだけです。
2) iPad2枚並べてBluetooth接続で見開き表示ができること
これは上に書いたとおりです。Bluetooth 接続だけで見開き表示させたいです。
3) 片ページずつめくれること
2枚見開きにしたときに片ページずつめくれるようにしたいです。
具体的には、1/2 ⇛ 3/4 ⇛ 5/6 とめくるのではなくて、1/2 ⇛ 3/2 ⇛ 3/4 ⇛ 5/4 ⇛ 5/6 という順にめくってほしい。 このめくり方だと、割と雑に(早めに)めくっても大丈夫です。これは紙の楽譜ではできないことです。
NewZik は半ページめくりという機能があるのに、何故か横画面にして見開き表示にするとこれ効かないんですよね。。。(意味不明)
4) 複数デバイスで楽譜を同期できること
これは必須。
特に iPad 2台で Bluetooth 接続で見開き表示する場合、両方のデバイスに同じファイルを入れておく必要があります(たぶん)。 forScore/Cue では WiFi で画像転送してるっぽいのですが、Bluetooth でそんな大きなデータを送れないので、ページ切り替えの信号だけ 送る、ということになるはずです。
とはいえ、実装めんどくさすぎるので iCloud Drive そのまま使うことになるかな。。。
試作
iOS の PDFView を使えば簡単に PDF を表示できるので、これを使ってアプリ作り始めています。 (古い StoryView ではなくて新しい SwiftUI ベースで始めたのですが、全然勝手が違うので苦しんでいるところ)
ソースコードは Github においてあります。とりあえず公開状態にしてますが、あとで閉めるかも。
とりあえず、試作して 1) はできることがわかりました。
私は DONNER と LEKATO の譜めくりペダルを持っているのですが、どちらもデフォルトではペダルを踏んだときにキー押下開始(pressesBegan)・終了(pressesEnded)の2つのイベントが連続で上がってくるようになっています。ペダル踏みっぱなしにしても、です。
なんですが、REPEAT スイッチをオンにしておけば、踏んだときに pressesBegan、離したときに pressesEnded が呼ばれることがわかりました。 なので、pressesEnded のほうを拾ってページめくりすればやりたいことが実現できます。
商標侵害申し立てのため、GooglePlayからアプリが削除された件
昨日、Google から連絡があり、私の作っているアプリ CashFlow Free を削除したとのこと。うぎゃー。
アプリ CashFlow Free は、その一部が第三者の商標を侵害しているとの申し立てがあったため、コンテンツ ポリシーへの違反により Google Play ストアから削除されました。
申立者は US からのようです。あのロバート・キヨサキ氏の代理人の模様。 確かにキャッシュフローゲームとかいうものがありますね。
勘弁してよ、、、アプリ名称変えないといけないかも。。。。 アプリ名変えるとすると、GooglePlay だけじゃなくて AppStore のほうも変えないといけないし、かなり大変です。
商標をチェックする
気を取り直して、先方の主張を読みました。さらに商標検索も実施しました。
商標は、標章(名前とかマークとか)と商品(の種類)の両方が同一または類似であれば商標保有者に排他権があります。ですが、どちらか一方が類似でない場合にはなりません。なので、このあたりを確認。
先方の商標は "CASHFLOW" という文字商標です。これはたしかに同一と言われてもしょうがない。
次に、区分を確認します。
Class 16 – Series of non-fiction books for financial education (Reg. No. 2668012)
Class 28 – Board games and equipment sold as a unit for playing board games used for financial education (Reg. No. 2285845)
Class 41 – Educational services, namely conducting classes, seminars, conferences and workshops, namely coaching workshops, all in the field of financial education (Reg. No. 2447394)
Class 41 – Providing computer games for financial education that may be accessed network-wide by either internet or intranet network users (Reg. No. 2940390)
うーん、ファイナンス関係の教育用の本とかボードゲーム、サービス、コンピュータネットワークゲームなどが対象になっていて、こちらのアプリとはだいぶ違うような。
日本での検索結果ですが、登録番号4677092で登録されてました。こちらも区分がこちらのアプリと違う。。。
41 インターネット又はイントラネットを利用した金融に関する教育用のコンピュータゲームの提供,通信回線を利用したコンピュータゲームの提供,電子出版物の提供 41C02 41K01 41Z99
なお、GooglePlayで配布するようなアプリの場合は、普通は 区分9や42になる ようです。ものによっても違いますが。
対応について
とりあえず、先方に対しては、区分が全然違うので(類似ではない)という主張を送りました。同様に Google にも申し立てをしました。
ですが、通らなかった場合はアプリ名称を変更しなければならなくなります。やれやれ、どうなることやら。。。
Google Play 販売者の消費税率変更をお忘れなく
Google Play でアプリを販売している場合、2014/4/1 になるタイミングで消費税率を 5% から 8% に設定変更しなければならないので注意が必要です。自動では(たぶん)変わらないので、手動設定が必要。
設定方法は以下のとおり。
- http://wallet.google.com/merchant/ にログイン
- 販売者の設定 ⇒ 消費税に進む
- 税金設定で、「その他の国と地域」の中にある「日本」に 8% を設定する。
即時変更?なのか数時間遅れになるかは不明。まぁ、3/31 の24時ちょい前にやっておけばいいのではないでしょうか。
Google Play の売上情報に、購入者の個人情報が入らなくなりました
2012年の1月に、最近 Android Market の売上レポートに購入者の個人情報が思いっきり入るようになってしまった件 という記事を書きました。当時 Android Market (現 Google Play) ではアプリ販売者に購入者の名前、メールアドレス、住所、電話番号が伝えられるようになっていて、その後少し改善されたのですが、名前・メールアドレス・住所の一部は最近まで表示されたままになっていました。
この状態だと、利用者は意図せず自分の個人情報が販売者に渡ってしまいますし、また販売側も個人情報を個人情報保護法に従ってきちんと管理をする必要があり大きな負担となるところなのですが、これは改善されつつあります。
先月あたりから、販売者に提供されていた Google Checkout 販売者アカウントが順次 Google Wallet に移行されつつあります(経緯はこのあたりを参照)。私のアカウントも先週移行されたので、内容を確認したところ、販売者の個人情報はほぼ表示されないようになりました。
以下は、販売者に提供されている Google Wallet マーチャントセンターの画面の一部です。

「顧客の住所」というところに注目。購入者の国名と7桁郵便番号しか表示されていません(郵便番号の末尾はぼかしてあります)。 以前から表示されていた、顧客の氏名・メールアドレス等は一切表示されないようになり、ほぼ顧客を特定することは不可能になっています。
逆に言うと、何かトラブルが発生しても販売者から利用者に対してメールで連絡することはできなくなりました。
利用者も、返金などを販売者に求める際は、きちんと注文番号を伝えるようにしなければなりません。これがないと、販売者は本当にアプリを購入した人なのかどうか確認する術がありませんので。
注文番号は、アプリを購入したときにメールで通知されます。また、Google Wallet にログインすれば注文番号を確認することができます(取引IDというところに書いてあります)ので、覚えておきましょう。
targetSdkVersion を明示しないと、Google Play がタブレット端末を除外してしまう模様
これまで、普通にAndroidタブレットの Google Play 上に表示されていたアプリが、最近になって非対応とみなされダウンロードできなくなる現象が出ています。どうも 5月中旬くらいに Google Play 側のロジックが変わった模様です。アプリ開発者は要注意。
具体的には、クックパッドやヤフオク、NAVITIME、LINEバブルなどが表示されなくなっています。
タブレットといっても、7インチの Nexus 7 などは問題ありません。Nenus 10、Sony Tablet S、LifeTouch L などのいわゆる xlarge なデバイスのみが対象です。
いろいろ条件を調べたのですが、スクリーンサイズでフィルタがかかっているようで、以下の条件をすべて満たしてしまうと表示されないようです。
- AndroidManifest.xml に targetSdkVersion が指定されておらず minSdkVersion が 8 以下、もしくは targetSdkVersion が明示されているが 8 以下。
- AndroidManifest.xml に <supports-screens> が指定されていない、または指定されているが android:xlargeScreens が true に設定されていない。
- 5月中旬(?)以降に Google Play で公開またはアップデートされている。
<supports-screens> の anroid:xlargeScreens 属性は、無指定の場合は暗黙に true とみなされるようになっています。しかし、この属性は API level 9 で追加されたものなので、API level 8 の時点では存在していません。どうも、targetSdkVersion が 8 以下の場合、最近までは xlargeScreens を true とみなしていたのが、5月中旬くらいから false とみなすように変更されたのではないかと思います。
なぜ、5月中旬くらいからかというと、それより前に公開されているアプリは 1. 2. の条件を満たしていても、xlarge デバイスの Google Play に表示されるケースがあるからです。
回避方法ですが、targetSdkVersion を 9以上にあげれば良いはずです。<supports-screens> の android:xlargeScreens も明示的に true にするのが推奨。
なお、Google のタブレット対応のガイドラインでは targetSdkVersion を 14 以上にすることになっています。ただし、targetSdkVersion を 11 以上に上げると、いわゆる互換メニュー(ステータスバーに出るメニューボタン)が出なくなるので要注意。ActionBar 使ってるアプリは関係ないので、心置きなく 14 以上にあげて OK なはずです。
スマートフォンアプリのクラッシュログ解析サービス (crittercism と bugsense) を使ってみた
クラッシュログ解析サービスの crittercism と bugsense を使ってみたのでその比較。
今まで Android/iOS アプリのクラッシュログ解析は、自前でやっていました。具体的には plcrashreporter を組み込んで、自前の Web サーバにクラッシュログ送って、ファイル保存しておくという方法だったのですが、ログを分類したり、シンボルを復元したりが超面倒なので正直あまり活用できていませんでした。
クラッシュログ解析サービスはいくつかありますが、比較的安価に使えそうな crittercism と bugsense を試用しています。 どちらも、クラッシュが発生したログを取得してサーバに送り、スタックトレースなどの情報をブラウザで閲覧することができます。
実際使ってみると超便利です。もうこの手のサービスなしでは生きていけません。
大量にログがでたら見るのが大変じゃないか、と思うかもしれませんが、同じ内容のクラッシュだったら1つにまとめてくれるのでその点はあまり心配ありません。
以下、参考にさせてもらった記事です。
アプリへの組み込み
アプリへの組み込み方は、crittercism, bugsense ともにほとんど同じです。ライブラリ・フレームワークをアプリに追加し、初期化コードを一行追加するだけ。Android の場合は permission を若干追加する必要がある程度です。初期化コードには、アプリに割り当てられた ID をセットしておきます。
これだけです。簡単ですね!
なお、Android で proguard を使う場合は、以下の一行を proguard の設定ファイルに書いておくと良いです。これがないと行番号がわからないので解析が難しくなります。
-keepattributes SourceFile, LineNumberTable
無料プランの比較
crittercism, bugsense ともに無料プランがあります。無料プランに限って言えば crittercism の圧勝という感じです。
- bugsense の無料プランにはシンボルの復元機能がありません。crittercism は iOS の dSYM復元および Android の proguard 復元の両方ができます。
- bugsense の無料プランは1ヶ月あたり500件までしかログを取得できません。cirttercism は制限なし?
シンボルの復元機能は特に iOS では絶対に必要です。これがないとどこでエラーが発生しているのかさっぱりわかりません。 Android のほうはファイル名と行番号があればいいので必須ではないですが。
またログの上限については 500件/月はたぶん足りないです。リリース直後にバグが発覚して、大量のクラッシュが一度に発生したりするとあっという間に超えてしまいます。
なので、無料プランで行くんだ!という人は crittercism 一択になると思います。
なおどちらのサービスも、無料プランでは機能がかなり制限されています。例えばキャッチした例外のログ取得とか、クラッシュの傾向分析とか、Logcat 取得などです。 ですが、クラッシュログ取得だけなら無料プランで十分なような気がします。
有料プランの比較
有料プランになると若干状況が変わります。一番安いプランに関していうと、crittercism は Premium プランで $24/月、bugsense は Indie プランで $19/月、なのであまり価格差はないように見えます。。。
が、crittercism のほうは「アプリ1個あたり」かつ「100,000ユーザあたり」で $24/月、という点に注意が必要です。例えば、1,000人程度のユーザしかいないアプリでも、10本あれば$240/月になってしまいます。またアプリ一本でもユーザが 1,000,000 人入れば $240/月です。(なおユーザ数が 500以下のアプリは無料の模様)
bugsense のほうはアプリ本数、ユーザ数は関係ないようで、そのかわりログ数が 25,000件/月ということになっています。また、bugsense の INDIE プランは Android の proguard シンボル復元がありませんので、これが必要な場合は $99/月の Enterprise プランにする必要があります。上に書いた通り proguard は別にいいかな、という気もしますが。
なので多少ならお金払っても良いという向きには bugsense のほうがいいかも、、、という気がします。
なお、crittercism の中の人に聞いたところ、アカウント2個作って片方有料プランにし、アプリを分けておくということもできるよ、と言っていました。また相談すれば適切なプランをオファーしてくれるそうなので、交渉次第では安くできるのかもしれません。
その他細かいところ
crittercism のほうは、クラッシュログを Unresolved, Known, Resolved の3種類に分類できます。また、それぞれのログにメモもつけられます。ですので、とりあえずログ解析したらメモ書いて Known にしておけば、仕掛中のものとそうでないのが区別できて便利です。
bugsense のほうは Unresolved, Resolved の2種類しかなくメモもつけられないので、Resolved 以外のが全部混ざってしまい、管理がちょっと面倒かなぁという印象。
サイトの見た目とかは bugsense のほうが好きなんですけどねぇ。
なお、乗り換えは割と簡単にできそうなので、当面は crittercism の無料プランで様子をみようかなと思っています。
Kindleストアで「スマートフォンアプリ配信の輸出管理」電子書籍を出版しました!
この度、Amazon Kindle ストアで電子書籍を出版しました。定価は300円予定ですが、出版記念ということで現在100円です。1ヶ月くらいしたら定価に戻しますのでお早めにどうぞ。

- 作者: 村上卓弥
- 出版社/メーカー: 村上 卓弥
- 発売日: 2012/11/23
- メディア: Kindle版
- この商品を含むブログを見る
iOS や Android 向けのスマートフォンアプリを配信する際、仮に日本にしか配信しないアプリであっても実は輸出許可が必要になることがあります。これは AppStore や Google Play のサーバが米国にあるためで、配信時には日本の輸出規制に加え米国の輸出規制もクリアしなければなりません。
本書は特に暗号を使用するアプリを配信する際の判断や、米国商務省への申告手続きなどについて解説しています。アプリ配信をすでにされている方、これからしようとしている方必携の一冊。
以前、このブログで書いた内容をメインに再構成、加筆を加えています。日本の輸出関連法規についても触れています。
今回はじめて Kindle Direct Publishing で出版したのですが、これは思ったより簡単でした。むしろ元データの作成のほうに苦労。データは InDesign で作ったのですが、EPUB しか念頭にないのなら HTML を直接作ったほうが早いかもしれません。
しかし、個人でも簡単に電子書籍を販売できるようになったのは素晴らしいことです。自分の書籍が Amazon で検索して出てくるのは楽しいですよ。ネタがある人は挑戦してみる価値があると思います。