の記事一覧 2020年05月

2020/05/28

【接触確認アプリ】政府仕様書を読んでみて(2)

【接触確認アプリ】政府仕様書を読んでみて

続きです。

Bluetoothの問題も出てきますが、待機状態でのバッテリーの消耗が激しいのが気になってしまう。それも、古い機種ほど顕著に表れる。政府仕様書には対応バージョンが

本仕様書の執筆時点では iOS 13.5 以上および Android 6 以上

と書かれている。

性能評価に関しても、

端末の応答は 3 秒以内とする。

接触の測定には Bluetooth を活用するが、電波干渉や障害物により正確に測定できないことがあるのでパラメータ設定に留意すること

と、謎の言葉が書かれている。

OSのバージョンは私が開発するのなら最新に近いバージョンに限定するだろう。古い機種でBluetoothを使えばトラブルに遭遇するのは目に見えている。何度も書いているが、バッテリーの持ちが悪くなるのは確実だ。

スマホで、3秒も動作が止まることを許容するのか?Bluetoothを活用と書かれているが、Bluetoothの通信障害の許容は行わないらしい。

仕様書の中で注意しなければならないのは二点。

端末での稼働率は 98%以上とし、サーバーの稼働率は 95%以上とする。

とあるが、停止時間ではなく稼働率なのがまたいやらしい。

一時的な停止により社会的に大きな社会的混乱を引き起こすものではない。障害時には 72 時間以内の復旧を目標とする。大規模災害におけるシステム停止時には、システム運用者と相談の上、1 週間以内の復旧を行う

となっている。矛盾する記述にも思える。

そもそも、3日間も放置を許すのならやる必要はない。その3日間の間にそれだけの人と接触するのかわかったものではない。

社会実験的な意味合いが強く、提案されて乗りました的な匂いがする。

いろいろ要求定義に書かれているが、これらを全部まとめると、”不可能”の言葉が頭に浮かんでくる。

そして、一番の問題は

スマートフォンの国民の個人保有率が 64.7%(令和元年版情報通信白書)であるので、最大で国民の6割以上が導入することを目指す想定で基盤等の拡張性を確保する。

この部分だ。国民と言っているが、渡航者でも利用できるように、英語での我慢を整備することと定義されている。

わかりやすいように、国民を1億人と定義すると、6、000万端末分のサーバが必要になってしまう。サーバに保存しているデータは4,200人分の14日分のデータだから、容量はそれほど多くはない。しかし、トラフィックが問題になる。仕様書を読むと、規定されているようには思えない。したがって、開発者の任意機能となる。

そのために、国の金だと思ってサーバの維持費を膨大な金額で設定することが考えられる。

さて、実際にアプリが無事リリースされたとして使うか?

私は使わない。

アプリを設定したら10万くれるとか言われない限りは使わないだろう。

まず、メリットが提示されていない。

感染者が近くに居たのがわかるだけだ。10万くれるという明確なメリットではないにしろ、感染者全員が承諾して、全員が追跡・追認できるようにならないと意味がない。強制できないのなら、意味がない。

また、バッテリーの持ちが悪くなる。Bluetoothを常時使う事で、スマホの熱対策が心配になる。もしかしたら、劣化の原因にもなるかもしれない。

この方式しか考えられなかったのだろうか?

Twitterでも書いたことがあるが、やった感を出すためだけにかなりの金額の”運営費”を払うのだろうか?

サーバはただじゃない。保守メンテもただではやらないだろう。使われないクズアプリの為に税金が使われるのだ、それも仕様を読んだ段階でかなり問題が見えてくる。今なら傷口は担当者の首を切るだけで幕引きができるが、セキュリティの問題が発生したり、最悪は乗っ取りまで考える必要がある。アプリなんて危険な方法を用いないで、もっと別な方法を考えればいいのに・・・。

 

2020/05/27

【接触確認アプリ】政府仕様書を読んでみて

接触確認アプリに関する仕様書等の公表

接触確認アプリの仕様書を読んでいると、昔作ったアプリを思い出す。

Bluetoothを待機状態にして、近くにいた同じアプリを使っている人と情報を交換する物だ。過去にさかのぼって、地図で接触場所を確認できるというものだ。

作っているうえで、Andoridは問題はなかった。正確には、問題はバッテリーの持ちが2割ほど悪くなるという問題だったが、Bluetoothの待機状態を常時待機から、数秒間のディレイを入れて対応した。それで、バッテリーの持ちが落ち込むのは5%未満に抑えた。

問題は、iOSの方だった。

iOSは、フォアグランドでBluetoothを待機状態にしてもバッテリーの持ちは2-3%の落ち込みだったが、問題は違うところにあった。

バックグラウンドでアプリを待機させると、待機状態の維持ができなくなるのだ。
Android にも似たような現象が発生するが回避方法があった。

記憶では、15分で待機状態が終了してしまった。再度待機状態に戻すのに、アプリの操作が必要になっていた。

ペアリングしている状態なら問題が発生しないBluetoothだが待機状態でのピア通信では問題が多発した。

この問題は解決できているのだろうか?
解決できていたとして、脆弱性に繋がらないのか?

仕様書を読むと、キーファイルを保存するように見える。DBを使ってくれるとは思うが、仕様書のまま作成すると接触した人の数だけファイルができる。14日間は保存するように書かれている。

スマホの容量はきにする必要がないくらいに肥大化しているが、保存すべき情報ではないのは間違いはない。

昔作ったソースがどこかに転がっていると思うから、公開しておこうかな?

政府が余計にことを考えないで、キャリアに丸投げした方がよかったと思うけどな。
キャリアが握っているSIMの情報と接続IPを元に接触確認アプリを作るのが良いと思う。

今の政府だとちょっとでもミスをすると政権が持たないのがわかっているから、慎重になっているのだろうけど、GPSと接続IPを使った接触確認アプリのほうが問題は少ないと思う。
Bluetoothは諸刃の刃だと思う。便利には違いないし、メートル単位での接触を考えれば仕様は満たすだろう。

しかし、それにはユーザの多大なる協力が必要になる。
開けたところで使った場合は?
フェスとかで大量に接触確認アプリが起動されていたら?
バックグラウンドで本当に取れる?ピア通信でも接続単位は1だよ?開けたところで、数百の端末情報を一度に処理できる?
店舗でも同じですよ。5人とかの密接状況を処理できるとは思えない。

あとは待機状態での、脆弱性は大丈夫?
わかりにくい文字列に接続しはなっている?
いろいろ考えると不安でしかない。
6月中旬って半月だよ?テストできるの?無理だよね?もうできている物を流用したとしても・・・。iOSの審査を考えると無理だよね?

2020/05/22

【覚書】Amazon 検索ウィジェットの文字化け対策

【覚書】WordPressでAmazon商品を簡単に表示するショートコード

で解説しているAmazon商品を簡単に表示するショートコードなのですが、2020年05月07日くらいから文字化けされるようになってしまっています。差塩は、2020年04月10日にAmazon側の問題として修正されたのですが、再度表示がおかしくなってしまっています。

日本語でなければ問題はないので、最初はエンコードの問題かなぁPHPのバージョンを変えた影響がでていると考えて、調査を行いましたが、エンコードではなく、Amazon アソシエイトで検索ウィジェットを参照しても同じような現象になってしまいます。

いくつかのサイトでも同様の現象が発生していて、Amazonに問い合わせしてくれた人がいます。

Amazonアソシエイト側の不具合で現在対応中だという事です。

文字化け対策は、”Amazonが対応してくれるまで待つ”が対応方法になってしまいます。

広告

2020/05/21

【VS2019】16.6.0

2020/05/13 に、VS2019の最新バージョン16.6.0がリリースされていた。

変更内容は、リリースノートを見た方が早いだろう。

地味にバージョンアップが行われているのだが、気が付いたときには更新を行っておいた方がいいだろう。

インテリセンスとかの修正が入っているのが地味に嬉しい。

複数で行う時には、バージョンを合わせた方がいいのだろうな。アセンブリまで更新されているし、通常使う物か検証していないからわからないけど、合わせないと何が発生するかわからないですからね。

開発プログラムのほうにも書いておいた方がいいかな?

VS2019のバージョン情報を埋め込んでおけば、ソースを展開した時に困らないからな。

2020/05/16

【覚書】WordPressのタグをC#から追加(WordPressPCL)

WordPressPCL を使って、C#から管理しているWordPress に記事を投稿する。
その時に、同時にタグを追加したい場合がある。っていうか、それができないと不便。

だから、作ってみた。

            string strUrl = wp.siteUrl;
            var client = new WordPressClient(strUrl + "wp-json");
            try
            {
                client.AuthMethod = AuthMethod.JWT;
                client.SetJWToken(wp.siteToken);
                //
                WordPressPCL.Models.Tag entry = new Tag();
                entry.Name = strTag;
                //
                var ctask = client.Tags.Create(entry);
                ctask.Wait();
                var tags = ctask.Result;
                //
                strRet = tags.Id.ToString();
            }
            catch (AggregateException ae)
            {
                ae.Handle((ex) =>
                {
                    if (ex is WPException)
                    {
                        errorMesseage(ex.Message);
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                });
            }
            catch (Exception ex)
            {
                errorMesseage(ex.Message);
            }

最終的に登録したタグのIDを取得するのは、記事を投稿する時に、必要になるのはIDだからです。

2020/05/04

【覚書】WordPressにC# WindowsForm から投稿

NuGet で WordPressPCL をインストール。

WordPress には、JWT Authentication for WP-API プラグインをインストール。ユーザー → 対象ユーザ → パスワードの設定。

認証

            CWPData wp = getSelectSite();
            if( wp != null )
            {
                string strUrl = wp.siteUrl;
                try
                {
                    var client = new WordPressClient(strUrl + "wp-json");
                    client.AuthMethod = AuthMethod.JWT;
                    client.RequestJWToken(txtUserName.Text, txtPasswd.Text).Wait();
                    //
                    var isValidToken = client.IsValidJWToken().Result;
                    //
                    if (isValidToken == true)
                    {
                        wp.siteToken = client.GetToken();
                        lblAuth.Visible = true;
                        //
                        int iPos = cbWPData.SelectedIndex;
                        _mWPData[iPos].siteToken = wp.siteToken;
                    }
                    else
                    {
                        lblAuth.Visible = false;
                    }
                }
                catch (AggregateException ae)
                {
                    ae.Handle((ex) =>
                    {
                        Console.WriteLine(ex.GetType().Name);
                        Console.WriteLine(" " + ex.Message);
                        if (ex is WPException)
                        {
                            lblAuth.Visible = false;
                            errorMesseage(ex.Message);
                            return true;
                        }
                        else
                        {
                            return false;
                        }
                    });
                }
                catch (Exception ex)
                {
                    lblAuth.Visible = false;
                    errorMesseage(ex.Message);
                }
            }

認証が成功したら、次は投稿

                string strUrl = wp.siteUrl;
                var client = new WordPressClient(strUrl + "wp-json");
                try
                {
                    client.AuthMethod = AuthMethod.JWT;
                    client.SetJWToken(wp.siteToken);
                    //
                    Post entry = new Post();
                    //
                    entry.Categories = getInts(txtCategory.Text);
                    entry.Tags = getInts(txtTag.Text);
                    entry.Title = new Title(txtTitle.Text);
                    entry.Content = new Content(txtBody.Text);
                    //
                    if (txtMedia.Text != "")
                    {
                        try
                        {
                            int iMedia = int.Parse(txtMedia.Text);
                            entry.FeaturedMedia = iMedia;
                        }
                        catch
                        {

                        }
                    }
                    //
                    var post = client.Posts.Create(entry);
                    post.Wait();
                    //
                    var result = post.Result;
                    //
                    txtWPUrl.Text = result.Link;
                    //
                    wp.lastCategory = txtCategory.Text;
                    wp.lastTag = txtTag.Text;
                    wp.lastMedia = txtMedia.Text;
                    saveWPData(wp);
                }
                catch (AggregateException ae)
                {
                    ae.Handle((ex) =>
                    {
                        if (ex is WPException)
                        {
                            errorMesseage(ex.Message);
                            return true;
                        }
                        else
                        {
                            return false;
                        }
                    });
                }
                catch (Exception ex)
                {
                    errorMesseage(ex.Message);
                }

いろいろ余計なソースがあるけど、こんな感じで任意のWordpressに投稿が可能。

認証のTokenは永続的に使える物ではないので、都度取得するくらいのUIが良いと思います。

広告

2020/05/03

【覚書】権限を取得して実行

                    ProcessStartInfo psi = new ProcessStartInfo();
                    //起動するファイルのパスを指定する
                    psi.FileName = appFileName;
                    //コマンドライン引数を指定する
                    if (strArgs != "")
                    {
                        psi.Arguments = strArgs;
                    }
                    if( bRunAs == true )
                    {
                        psi.Verb = "runas";
                    }
                    //
                    hProcess = Process.Start(psi);

パラメータ部分は省略していますが、ProcessStartInfo をセットして実行すればいいだけ。