プログラムの事とか

お約束ですが「掲載内容は私個人の見解です」

ユピテルスイング練習機用 iOSアプリ(非公式)をつくりました

ました。仕事で作ったことはあったけど、個人でiOSアプリ公開したのは初めてです

Swing Logger

Swing Logger

  • Yoshihiro Hada
  • スポーツ
  • 無料
apps.apple.com

何をするソフトかというと、ユピテル社が発売しているGST7-BLEというやつが送ってくるデータをクラウドに送る、ことだけが目的のソフトです

f:id:puni-o:20190806115049p:plain
こんな感じ

作った経緯

GST-7 BLEとは?

私は初心者ゴルファー歴15年くらいのベテラン初心者なんですが、ゴルフって自分のステータスをいろいろと数値化できるところが魅力の一つだと思います

ゴルフやっていない人でも中継を見たことがある人は結構いると思いますが、たまに選手後方のカメラでボールの軌跡が出たりヘッドスピード等の数値が出たりしてませんか?(渋野選手メジャー制覇おめでとう)

あれは大体Trackmanという軍事用に使用されていたドップラーレーダー式弾道追尾システムで測定しています https://ja.wikipedia.org/wiki/トラックマン_(ゴルフ用具)

ゴルフやっている人はみんなあれが欲しいんですが、2~3百万円する代物なので個人で買うにはだいぶハードルが高すぎです

ということで、一般人にも手の届く測定器として人気があるのがYupiteru GOLF GST-7 BLEです

ドラコン選手も愛用しているとかしていないとか。とにかくコスパがいい代物です。Amazonの評価も高いです、納得です

公式アプリ

GST-7 BLEのBLEはBluetooth Low Energyで、BLEでスマホの公式アプリにデータを飛ばすことができます。BLEがいらない人はGST-5という一世代前のものがあるのでそっちを買うはずです。ということでGST-7を買った人は全員がこの公式アプリを入れて試すはずです

各OSのストアをのぞいてみると・・・

f:id:puni-o:20190806132440j:plain
iOS App Store

f:id:puni-o:20190806132535j:plain
Android Google Play ストア

どちらも評価は低く求めているものは同じです

  • アプリの表示が貧弱・編集できない
  • PCにデータを転送したい場合SDカードを経由しなければならない

私も使ってみて同じことを思いました

ということで作ってみた

解説

機能

  • データアップロード

最初に書きましたがGST-7 BLEのデータをクラウドに上げるのが目的です。上げてしまえばあとはデータの加工をするのもダウンロードしてExcelで管理するのもしたい人が好きにすればいいので

swingdataviewer.azurewebsites.net

  • オーバーレイ録画

プロの試合のように録画してデータをオーバーレイできたらいいかなーという出来心で作ったもの。開発期間のほとんどはこの機能の実現に使った、すごく苦労した、そしてそんなに使わない

youtu.be

裏側

Azureです。Azure大好き人間なので

スマホからのデータ受信はFunctions、データの表示部はWeb Appsでやってます。ふつうだな

データを保存して表示してダウンロードできればいいので実装もそんな感じ

Xamarin.Formsを使ってiOS/Androidどっちでも動くものを目指しています

iOSだけリリースしているのは私がiPhoneユーザーだから、Android版はGoogleにお布施をしていないし実機を持っていないので未定(おっと欲しいものリストに何かが・・)

  • プロジェクト

github.com

Webやデザインに明るい方がいたらIssueやプルリクが欲しいので(ある程度動くようになったので飽きた)

スマホ側のソースはこのまま公開していいのかよくわかってないのでとりあえずIgnore

欠点

ゴルフをやっていてGST-7 BLEを持っていてGitHubのアカウントを持っている人が一体何人いるんだろうか・・・

Azure Maps Tileを使う

Azureのサービスの一つにAzure Mapsというのがあります

azure.microsoft.com

上記リンクの説明を見ると地理情報サービスって感じですが、地図サービスももちろんあります

独自(?)の地図コントロールも提供されています

azuremapscodesamples.azurewebsites.net

Bing MapsのころからMicrosoftの地図コントロールは出来が良かったのでこれも期待できそうです

Azure Mapsのタイルを使用する

ここからが本題

地図のタイルと言えばOpen Street Mapが有名ですね。Google Map高いからね、意識低い系企業さんなんかは「無料で使える地図」って認識で使うんですね。まぁそんなことしていたらOSS潰れちゃうから企業はちゃんと寄付なり課金なり自前サーバー立てるなりした方がいいと思います

ということでAzure Mapsつかいましょ。ざっくりした地図でいいならStandard S0で毎月25万トランザクション(15タイルで1トランザクション)の無料分がついてきます、かなり安いとおもいます

実際にOpen Street Mapと比較してみましょう

Azure Maps Tile

Azure Maps Tile

Open Street Map

Open Street Map

重ねてみる

f:id:puni-o:20190717111916j:plain

・・・昔を思い出しますね

まとめ

地図がスカスカなのはまだ我慢できるとして、幹線道路がずれているのは勘弁してほしいところです。今後このタイルが更新されるのか謎なんですが、更新してくれるんですかね?ゼンリンさんからデータ買い取ったりしてくれないですかね?

.NET側からP/Invokeで関数ポインターを渡したら落ちた話

不定期更新のやらかし投稿です。7Pay報道みて笑っている場合じゃなかった

やりたいこと

C#側(今回は.Net Core)からVC++のdllに関数ポインターを渡してdll側から呼んでもらう

実装

P/Invokeの具体的なのはググってください

ということでC#

class TestClass
{
    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    delegate void TestFunctionDelegate();
    [DllImport("test.dll", EntryPoint = "SetFunction", CallingConvention = CallingConvention.Cdecl)]
    static extern void SetFunction(TestFunctionDelegate function);
    public TestClass()
    {
        SetFunction(this.A);
    }
    private void A()
    {
    }
}

SetFunctionって関数でTestClass.A()ポインターを渡しているつもりです

何の問題もないと思うんですよねー、見た目ねー。これでしばらくしてからdll側から渡された関数ポインターを実行すると・・・

A callback was made on a garbage collected delegate...みたいなやつが出て落ちます。GCDelegateを消しているみたいですね

dnSpyで見てみる

ビルドしたアセンブリをdnSpyに突っ込んで上のコンストラクタ部分を見てみます

public TestClass()
{
    TestClass.SetFunction(new TestClass.TestFunctionDelegate(this.A));
}

そりゃGCで消されますよねー、ですよねー。Delegateわたしが楽ちんちんに書けるもSyntax sugarの一つだったのか

ということで修正

コンストラクタのあたりだけ

private TestFunctionDelegate _testFunctionDelegate;
public TestClass()
{
    _testFunctionDelegate = this.A;
    SetFunction(_testFunctionDelegate);
}

まとめ

これは知らなきゃ気づかないよー、ゆるしてくださいよ~~