2021-11-30

Google Drive API:Requested entity was not found のエラーが出た時に考えること

 Androidアプリの開発で、ある特定のGoogleドライブ内のファイルを操作する(読み書きする)プログラムを実行すると、表題のように

  • Requested entity was not found
というエラーが出ることがあります。IDは間違っていません。これが意味することは何でしょうか?

認証スコープの設定を確認
Androidアプリ側から(今回の場合は、Flutter)SpreadSheetやDriveのファイルを操作するには認証とスコープの設定が必要になりますが、問題はこのスコープです。

[スコープ:https://www.googleapis.com/auth/drive.file]の意味
これは、このアプリで開いた、または作成したGoogleドライブのファイルとフォルダを表示および管理できます。言い換えると、Google Drive内にある既存のファイルを操作することはできません。表題のようなエラーは、このスコープの制限にひっかかった時に出てきますのでわかりにくいです。

フルアクセス[ https://www.googleapis.com/auth/drive]の意味
フルアクセスにすれば、上記のエラーはでませんが、Googleの認証を受けていない状態であれは、Warningメッセージがクライアントに出ることになります。



2021-11-22

はじめてのPySimpleGUIコード

とりあえずテンプレ的なサンプルコードをアップします。ポイントは以下の通り。

1.GUIウィジェットを先に宣言しとく。宣言しなくてもレイアウトに直接ぶっ込むこともできますが、それはちょっとスマートではないので。。。(個人的見解)

2.ウィジェットのレイアウトはリストで並べる(ここがPySimpleGUIのキモとも言える)。サンプルのように書くことで、並ばせかたを行列のイメージで配置できる。もちろん、frameやcolなどのオブジェクトを利用することでもう少し凝ったこともできるが、この記事では範囲外とする。

3.ウィンドウ表示ループは関数化しておく。下記のshow_window関数がそれに該当する。ここでメインウィンドウを生成して、無限ループでイベントを待つ(read関数)。

4.イベントの種類や、それに付随する情報がread関数の引数で送られてくる。ここで、ウィンドを閉じた時はイベントを抜けて終了するように書いておかないと、後でいろいろ厄介。この記述は必須のテンプレと思われる。

5.本サンプルは、ボタンクリックイベントに対応した記述をしているが、ボタンクリックイベントの識別は、ボタンのラベル名が対応しているらしい。これが嫌な場合は、key属性を使うとよい感じ。



PySimpleGUIはじめました

今年から、ゼミでもPySimpleGUIを使うことにしたのでその第1報。

PySimpleGUIとは

PythonでデスクトップGUIアプリを作成するのはどうすればいいか?というのはいろいろ議論があるようですが、ここ最近は、PySimpleGUIでよくね?という風潮になっているようです。PySimpleGUIは2018年に出てきた新参のライブラリです。

TkinterかPySimpleGUIか?

Python標準のGUIライブラリとしては、Tkinterがあります。Tkinterについては

  • インストール不要
  • Tkという古くからあるGUIライブラリを利用。
  • 書き方が若干、昔風

という特徴があります。最後の書き方が昔風というのは、私のような老人には意外とすんなり理解できるところでもあります。が、PySimpleGUIは今風ですね。意外と日本国内でもブログ記事が多くなってきたので、ここは思い切ってPySimpleGUIをゼミの標準ライブラリとしてみました。

ライブラリのインストール方法

下記の通りpipでインストールできます。

pip install pysimplegui

以後、PySimpleGUIのネタをちょくちょく書くことになるかもしれません。

関連リンク




2021-11-20

PlatformException(network_error, com.google.android.gms.common.api.ApiException: 7: , null, null)

 表題のようなエラーが出た場合は、ネットワークにうまく接続できてないというのが原因です。解決策としては

  • 端末(またはエミュレーター)がネットワーク接続できているか確認する。
  • Proxy設定を確認する(エミュレーター、Android Studio本体)
で試行錯誤するしかないでしょう。おちラボでも時々このエラーに遭遇することがあり、悩めるところであります。



2021-11-15

Windows環境でのマイク音がおかしい時の試したいこと

 先日、PCを買い替え、Windows11にしたところ、マイクの音がやけにおかしいという状況になりました。具体的には

  • エコーして聞こえる
  • ノイズキャンセリングされている?
  • 音が遅延する
という感じで、特に特別なソフトを介してもおらずどうなっているのか。。。。と試行錯誤。これじゃあZoomとか、オンライン動画の作成に支障がでるな、、と困惑しておりました。

原因と対策
原因として考えられるのは、OSのカーネルミキサーというやつが悪さをしている可能性があり。。解決策として、
【コントロールパネル】→【ハードウェアとサウンド】→【オーディオデバイスの管理】
で設定を次のように変更する。
  • 【録音】より該当のマイクを選択→プロパティで詳細の「排他モード」と「オーディオ機能拡張を有効にする」のチェックを外す
  • 【再生】より該当のスピーカーを選択→プロパティで詳細の「排他モード」と「オーディオ機能拡張を有効にする」のチェックを外す
注意点は後者の設定かな。。おそらく、前者のマイクの設定だけで解決しているのだろうけど、後者が悪さをして治ってないように見える、、、このトラップにハマって無駄な時間を消費しました。

補足
すべてのWindows PCでこのような現象になっているわけではないというのが、これまた問題。ノートPCでは問題ないし、自宅のデスクトップでも問題なし(いずれもWindiows11)。環境依存ということでしょうか。。


2021-11-07

com.google.android.gms.common.api.ApiException: 12500: のエラーに対する対応

FlutterでFirebase使ったGoogle認証をする際に、よくこのエラーに遭遇するのでメモ書き。詳細は、参考サイトを参照のこと。

このエラーに対する解決策は主に以下の方法

  1. Firebaseプロジェクトの認証でGoogle認証を有効にする
  2. Firebaseプロジェクトにメールアドレスを登録する
  3. google-service.jsonファイルをダウンロードしなおす
  4. build.gradleの設定を確認する(プロジェクトレベルとアプリレベルの2つのファイルの設定が必要)
  5. FirebaseにSHA1、SHA256キーを登録する(SHA1だけでも良い?)
  6. エミュレーターをGoogle Play Storeに対応しているものに変更する

参考サイト



2021-10-31

FlutterでGoogle signinの画面が終わらない場合の処理

 FlutterのGoogle siginの処理で初歩的なミスで躓いたのでメモ書き。(なお、FlutterでのGoogle siginの処理のための各種処理の話はここでは省略します)

【症状】

  • Google signinの画面で、待機画面からずっと画面が遷移しない
  • スコープがemailの場合はうまくいくが、それ以外のスコープを指定するとダメ
【解決策】
  • Filebaseに登録しているアプリでの認証で、Fingerprintの情報はSHA-1だけでなく、SHA256も追加する。 
ということで無駄な時間を浪費しました。Google siginの処理の情報をネットでググると、SHA-1の情報を登録する記述はよく見るのですが、SHA256も必要だとは。。。
ちなみに、ログイン認証だけならSHA-1だけでOKです。今回は、Drive APIを扱おうとしてエラーがでました。



2021-10-24

Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is xxxx, expected version is yyyyy"

表題のようなエラーが出た場合、下記のように対応。

(1)gradle-wraper-propertiesの中身でgradleのバージョンを変更

  • distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-all.zip

(2)build.gradleでKotlinのバージョンを変更
  • ext.kotlin_version = '1.4.32'
なぜこれでいいのかは不明。Gradleのキャッシュがクリアされる??Stack overflowから得たネタです。

Reference





Firebaseを用いてGoogle認証をする(クライアント処理、Flutter,Dart編)

 FlutterでGoogle認証するためのメモ書きです。メソッドがバージョンによって変わっているのか、ネットの情報どおりに書いても動かなかったケースがありました。今回のケースでは

  • ダメなケース→ await googleLogin.signIn();
  • OKなケース→  await GoogleSignIn().signIn();

という記述ですね。前者だと認証がいつまで経っても終わりませんでした。Flutterに最近手をつけ始めてますが、Gradle,Dart, Flutterなどのバージョン調整がいろいろめんどくさいですね。





2021-08-22

GASで正規表現を使ったReplaceに変数を用いる方法

 初歩的ですがメモ書き。

GAS(Google App Script)で正規表現を使ってReplace関数を使うときは、第一引数に直接正規表現を記述することができます。例えば、replaceを複数の対象に実行したい場合

result = result.replace(/abc/g, "ABC");

こんな感じにすればOK。。。しかし、abcのところに変数を使い場合にはどうすればいいか?正解は、RegExpクラスを使いましょう。。ということになります。

    var target = "abc";   
    var reg = new RegExp(target,"g");
    result = result.replace(reg,"ABC");




2021-08-16

GAS: You do not have permission to call DriveApp.Folder.createFile. Required permissions:

 Google App Scriptの中で、Google Driveを操作するコードを書いたとき、表題のように

  • GAS: You do not have permission to call DriveApp.Folder.createFile. Required permissions:
というエラーが出るときがあります。どうやら、カスタム関数の中では使用できない?という仕様のようで、場所を変更したら普通に動きました。もしかすると別の回避方法があるかもしれませんが、うまくいかない場合は記述場所を変えてみるといいでしょう。



2021-07-14

AttributeError: 'Template' object has no attribute 'add_description'

Zappaを使ってAWS LambdaにFlaskのスクリプトをアップしようとしたら、表題のようなエラーが。。。どうやら、最近この現象が起き始めているようで、Githubのissuesにも取り上げられているようです。

解決策

当面の解決策は、

  • pip3 install "troposphere==2.7.0"
を実行すること。。どうやら、AWS側の問題らしい。よくわからんけど、とりあえず動いているので良しとしよう。



2021-07-10

DynamoDBに正式移行しました

おちラボでは、ようやく、、、、よーやく研究室の公式DBをSimpleDBからDynamoDBに移行しました。

なぜ今まで移行しなかったか?
DynamoDBについては、2012年に

という記事を書いたように、早くから注目していましたが、料金体系に問題があり(後述)、ゼミでの利用に不向きだったこともあり、SimpleDBを利用していました(AWS:SimpleDBをセットアップする)。しかし、SimpleDBはいつ死んでもおかしくないようなサービスなので(全くSDKがバージョンアップしていない)、このまま使う続けるのはまずいよな。。と流石に思い始め、かつ後述するように料金体系がいつの間にか変更されていて、使いやすくなっていたので、今年から切り替えることになりました。

DynamoDBの料金体系を確認する
現在、DynamoDBには2つの料金体系が存在します。
  1. プロビジョニング
  2. オンデマンド
1は昔からあるタイプで、いわゆる事前割当になります。これが問題だったのは、テーブル毎にプロビジョニング設定をしないといけないということ。つまりテーブルを増やせば増やすほど課金されます。これは使わなくてもです。一方、2は最近出てきた料金体系で(2018年に発表されたようです)、使ったぶんだけ、、ということになります。SimpleDBがまさにこの料金体系だったので、おそらくこの料金体系を用意することで、SimpleDBのユーザを移行させようとしているのではないでしょうか(私みたいに)?

実際安くなるのか?
ただし、オンデマンドの場合、青天井に増えていく可能性がありますので注意が必要です。真面目に運用をはじめると、プロビジョニングのほうが割安でしょう。ただ、ゼミでちょっと学生に使わせるとか、テーブルを気軽に増やしておけるというのは大変ありがたく(これが正しいDynamoDBの使い方なのかはおいといて)、現状だとDynamoDBについてコストはほぼ発生していない状況です。

というわけで、今後はDynamoDBについての記事も増えてくると思います。






2021-06-17

Bleakライブラリを使ってBLE端末を探す

 以前(といっても4、5年くらい前)、WindowsでBLEのプログラミングしようと思ったら、情報も少なくすごく大変で、卒研生の研究時間の大半をBLE接続に費やしてしまった経験があり、もう二度とWindowsでBLEプログラムをするもんか。。。と誓ったことがありましたが、今は便利になってきてますね。Pythonであっさりできます。

Bleakというライブラリ

PythonでBLEというのはまあ以前から目にしたことはあり、ちょっとトライしたことがありましたが、最近はBleakという便利なライブラリがあります。Windows,Mac,Linuxで動作するという。。

asyncioで非同期処理

Bleak自体の使い方は超シンプルなのでほぼ説明不要。肝は、asyncioで非同期処理をするということですね。




2021-06-10

Zappaを使ってLambdaにFlaskアプリを導入した際のURL問題の解決法

 Zappaを使うと、AWS Lambda上にてウェブアプリをお手軽にDeployさせることができます。おちラボで動かしているのはFlaskのアプリなんですが、1つだけ問題が。。。。

ディレクトリ階層に余分なprefixがつく問題

ZappaでアップロードしたURLには、/dev/みたいな余分なURL(Stageという概念ですね)が付いちゃいます。これはAPI Gatewayの仕様らしく、回避不能のようです。api的な使い方だったら別にそれを前提にしておけばいいんですが、アプリとしてDeployする場合、アプリ内で自身の別URLを呼ぶ場合に都合が悪くなります。例えば、

  • (ローカル環境)/update
  • (Lambda環境) /dev/update
というふうに、”/dev”みたいなstage表記がもれなく付いてきます。静的にURLを記述しちゃうとローカルで動くけどLambdaにデプロイするとURLがNot foundでエラーになったりするわけです。

解決策:動的にURLを定義する
まあ、当たり前の解決策なんですが、実行環境に合わせて動的に定義するしかないです。例えば以下のようにosの環境を調べておいてからstageを渡すという方法ですね。下記の場合は、ローカルがWindows環境を想定していますので、まあLambdaのOSがWindowsなわけがないので(Amazon Linuxのはず)、これでOKでしょう。



2021-05-23

Visual Studio2019 でBlazorを利用しようとしたらパッケージが見つからない

Blazorというのが面白そうなので、遊んでみようかと思ったら、デフォルトのプロジェクトでいきなり

  • パッケージ xxxxxxxxが見つかりません。

というエラーに遭遇したのでいろいろ調べて動くようになったメモ書きです。

.NET5.0にしたほうがいいかも
もしかしたら、直接は関係なかったかもしれませんが、

 Blazor 3.2 WebAssembly プロジェクトは、.NET Standard 2.1 (<TargetFramework>netstandard2.1</TargetFramework>) をターゲットにするようコンパイルされていました。 ASP.NET Core 5.0 では、Blazor Server と Blazor WebAssembly プロジェクトの両方で .NET 5.0(<TargetFramework>net5.0</TargetFramework>) がターゲットとされます
的な話が、Microsoftのサイトに書いてました。まあ、流石に NET Standard 2.1 はもう古い気もするので、.NET5でプロジェクトを作成したほうがいいですね。PCに.NET5のSDKが入っていれば作成時に指定できます。指定できなければ入ってないのでダウンロードしてインストールしてください。

Nugetのパッケージソースを指定する
これが根本的な原因かな。。Blazorのために久しぶりにVisual Studiioをいれたんですが、エラー的にパッケージが見つけられない→Nugetがなんとかしてくれるはずだよな。。とか思ってたんですが、まさにNugetがダメでした。参照するパッケージソースが空になってるんですよね。。。なんでやねん!というわけで、正しいURLとして
  • nuget.org
    https://api.nuget.org/v3/index.json

を指定。これでBuild時に探しにいってくれました。

 参考



2021-03-20

YoutubeLiveで配信が始まらないときの原因と対処方法

Youtube Liveをやってみようということで、先日から試行錯誤していたのですが、配信がはじまらず、クルクルと待機のアイコンが回るばかり、、ということがたまにありました。それも別のPCだったらちゃんと動いたりして、ネットワークの問題か?機種依存か?など、、移行錯誤しましたが、しょーもない理由でした。

原因:カメラ、マイクは正常に使えているか確認しましょう

私の場合、原因はマイクでした。BLEで接続する無線マイクだったんですが、USBトングルをPCに挿して、それはちゃんと認識されていて、、という状況で、問題ないはずなのに、なぜか配信が開始せず。。。で、USBトングルを抜いたら開始されて、刺したら開始しない。。。どーいうこと???と原因は、「マイクの電源が入ってなかった」ということでした。ほんとくだらない理由ですが、マイクは意外と確認しにくいところなので、要注意です。

補足:ネットワークのポートも注意

YouTube LiveはTCP1935(RTMP)も利用するようなので、これも要注意です。ここが塞がってると当然配信は始まりません。



2021-03-02

Zoomでの学会発表、研究発表にてプレゼンタイマーアプリをスマートに導入する方法

 Zoomで発表会をするときに、ベル係やタイムキーパーの役割をどうするかで悩むときがありますね。マイクでベルを音を拾うのも味気ないし。。。という方への情報です。

要求仕様

  • タイムキーパー系のソフトを使う
  • 画面をZoomで流す
  • 音もZoomで流す

用意するソフト

  • ベルソフト ・・・ TimeKeeper(これじゃなくてもいいですが、このウェブアプリががおすすめです)
  • Manycam ・・・ 仮想カメラ・マイクアプリ(今回の話の肝です)
Manycamの設定
今回のお話の肝は、このManycamというソフトです。仮想カメラ・マイクになる機能を持っており、複数のカメラや映像シーンの切替、映像効果の付加など、いろいろ高機能なソフトです。実は有料アプリですが、無料の範囲で上記の要求仕様を満たすことができるのがポイントです。具体的には以下のとおり設定します。

(0)Timekeeperを起動しておく

(1)ビデオソースの設定
 右側のメニューから画面のプリセットを選んで、右下のビデオソースのところで、デスクトップ→アプリケーションウィンドウ→Timekeeperのブラウザを指定します。フリー版では、1つのウィンドウしか登録できないのでプリセットを空にして1つだけ登録するようにしてください。

(2)オーディオインプットの設定
右側のメニューから音声を選んで、オーディオインプットのところで、システムサウンドを追加してください。これもデフォルトで設定してある場合は削除し、空にして1つだけ登録するようにしてください。

下の図は、左がビデオソース、右がオーディオインプットの設定の例です。


Zoomの設定
あとは、Zoomでカメラとマイクを設定するだけです。カメラとマイクのリストにManycamというのがリストアップされているはずです。これを両方選ぶだけでOKです。この際、Zoomで表示されるTimeKeeperの画面が反転して見えますが、受信側では普通に写っていますのでご安心ください(念の為、確認はしたほうがいいですが)。
また、設定画面にて「音楽とプロフェッショナルオーディオ」をONにします。これにより、Zoomのノイズ抑制機能が無効になるので、ベル音を劣化なく送信することができます。

この方法の欠点と注意点
Manycamのフリー版では、1つのオーディオデバイスしか設定できないため、Timekeeperの音出す時とマイク使うときでは、Zoom側でマイクを切り替えないといけません。
また、Zoomは発話者の音声を優先する仕組みになっているので、発話者の音声に負けてベル音が聞こえない場合があります。ですのでTimeKeeperの画面を常時表示しておくのがポイントです。

補足
ManycamFree版の制約が、音声並びに映像のソースが1つしか選べないことだけだと思ってますが、他に時間的制約(急に使えなくなる?)などがあるかどうかは確認してません。この点はご了承&ご注意ください。