2020年5月4日月曜日

GAS:自分が参加しているクラスの情報を取得する(Google Classroom API)

Google Classroomは何かとUIが不便なので、個人的にGASでアプリやツールを作り始めています。というわけで、メモ書き。。。下記のサンプルでクラス情報を取り出すことができます。まあ特に特筆するところはないですね。なお、
  • 自分の参加しているクラスしか取得はできない
  • ドメイン管理者は全クラスが取得できる
となっています。



2020年5月3日日曜日

Hangouts Meet でパワーポイントスライドの画面共有の注意事項

前回の記事
がやたらとアクセスが多いことに気づいたので追加記事です(ネタも古くなってますし)。

パワーポイントスライドショー実行時にあいかわらず問題あり?
この半年は私はMeetを使う時は基本的にGoogleスライドを共有して使っていたので、「Meet +パワーポイント」の組み合わせはあまりやってなかったんです。で、あらためて試してみると、相変わらずパワーポイントとの画面共有が弱いですね。どうやら
  • スライドショー時の画面共有範囲は、元のパワーポイントのウィンドウの位置とサイズに影響される
という仕様になってますね。つまり、以下のとおりです(学生画面はスマホアプリです)。これらはパワーポイントのウィンドウを共有した場合の挙動です。

これはなかなか気づかないバグなので気をつけてください。ちなみに全画面共有にしておけばこの問題は発生しません。


GAS: GoogleSheet上の画像にスクリプトを動的に割り当てる

GoogleSheet上でアプリを作成する時、画像にスクリプトを割り当ててボタン代わりにするのはよくあるTIPSです。しかし最近、
  • 画像に割り当てたはずのスクリプト設定が消える
という問題が頻発するようになり(一時的なバグかも知れませんが)、どうしたものかと考えた結果が今回の記事内容です。表題のとおり画像へのスクリプト割当は、GAS上で動的に設定できるようです。(画像の配置もGASでできるようです)

注意点:画像は挿入したものにする
Sheet上にボタン代わりの画像を置く時、【図形描画】アプリを使って画像を作成するのがラクですが、この方法だとSheet上の画像を認識することができないためダメです。つまり、
  1. ボタンとなる画像をファイルとして作成しておく
  2. Sheetに画像挿入のよりその画像ファイルを置く
となります。この手順を踏むことで、画像がGoogle Driveに格納されてidを持ち、GASで扱えるようになるのでしょう。なお、複数の画像を配置した場合、どのオブジェクトがどの画像かの特定する必要があるので、代替テキストの情報を利用するといいでしょう。
下記のサンプルは、画像にtestというメソッドを割り当てています。



2020年3月31日火曜日

PythonでFirebaseを用いる際のサービスアカウント情報の設定

最近、ボチボチとGAEとかFirebaseとか、いわゆるGCP周りのサービスを触っているのですが、それらを利用するための認証系のところがいまいち理解できてなくて、急にプログラムが認証できなくなったりして、、、ということがあったのでメモ書きです。

エラーの例
以下のようなエラーがでた場合、認証系のところでトラブってることになります
google.auth.exceptions.DefaultCredentialsError: Could not automatically determine credentials. Please set GOOGLE_APPLICATION_CREDENTIALS or
explicitly create credential and re-run the application.

サービスアカウントの設定方法
GCPの管理画面でサービスアカウントキーを作成してダウンロード(jsonファイル)しておきます。認証設定しないといけない箇所は
  • 環境変数の設定
  • CREDENTIALS情報の読み込み
の2つです。実は、前者の環境変数を設定しておけばコード内に認証情報を明示的に指定する必要はありません。環境変数の設定はシェルで設定するPythonかプログラムで明示的に設定するかのいずれかですが、認証ファイルの情報をコード内で明示的に書かないほうがいいので、シェルで環境変数を設定するのがベターです。Pythonの場合は下記の通りです。



2020年3月11日水曜日

Python:OpenCVで動画再生時の各フレームの絶対時間を取得する方法

OpenCVで再生している動画(mp4など)に対して、「○時○分○秒の動画を再生したい」という時の各フレームの絶対時間を利用したい場合、そのフレームの絶対時間がわかればいいんですが、どうやら記録されていないようです。そこで、次のアプローチが考えられます。

再生開始時からの経過時間は取得できる
cv2.CAP_PROP_POS_MSECを利用することで、再生中のフレームの経過時間(相対時間)を取得できます。つまり、動画の再生開始の絶対時間さえわかれば、この時間をプラスすることで再生時間がわかります。

再生開始時間を取得するには
動画ファイルの保存時間が1つの手がかりになりますが、それは動画が終了した時の時間になります。ただ、経過時間はわかるわけですから逆算すれば求めることができるでしょう。ただし、ファイルのタイムスタンプは秒が最小ですので、ミリ秒単位での誤差(最大999ミリ)が生じます。

録画時に細工をする
もし、動画録画のアプリケーションに細工ができるなら、録画開始時間を記録しておくとよいでしょう。録画アプリケーションをOpenCV等を利用して作成して、各フレームの時間を記録することもできると思います。どちらがスマートかは As you likeで。。。。

2020年3月9日月曜日

Python:TkInterを用いてウェブカメラの映像を表示する(OpenCV利用)

前回の記事では、OpenCVのGUIを利用してウェブカメラの映像を表示しましたが、今回はPythonの標準的GUIライブラリであるTkInterを用いて表示してみます。

プログラムのポイント
ポイントは次の2点です。
  • TkInterでの表示形式に画像を変換する
  • TkInterのafter関数を利用して再帰的にループ処理を実現する
このプログラムだと、FPSの数値もほぼ変わりません(数値的にも若干落ちているような気もするという程度)。GUIを操作してもフレーム読み込みの処理が止まりませんので、OpenCVだけのよりはこちらのほうがいいかもしれません。



2020年3月7日土曜日

Python: Webカメラの映像をOpenCVを用いて表示&録画する

OpenCVを用いて通常のWebカメラの映像を表示&録画するサンプルです。この程度の処理であれば、Pythonでも速度は問題なく出ます。利用したカメラの仕様が30FPSでしたが、このプログラムを計測するとほぼ30FPS出ることを確認しました。(ただし、シングルスレッドなので、ウィンドウ操作をするとFPSがガクンと落ちます)
コーディングにおいて特筆するべきところは、以下の通り。
  • VideoWriter_fourcc関数で動画のフォーマットを決める(どんなフォーマットがあるかは調べてみましょう)
  • readメソッドの戻り値は、読み込みのTrue/Falseとフレーム


2020年3月4日水曜日

Python: RealsenseのRGBとデプスのカメラ映像をOpenCVを利用して表示する

おちラボではMicrosoft Kinectを利用したソフトウェア開発をしていますが、御存知の通りKinectは要求するマシンスペックが高いので、なかなか使いづらいというのがあります。単純にデプスカメラとして使うなら、IntelのRealSenseがオススメです。

SDKとライブラリのインストール
リンク先を見てもらえばわかりますが(特にpyrealsense2の方)、Windows環境では何も気にすることなくSDKをとってきて、ライブラリはpipでインストールできます。Macの場合、いろいろ手間がかかりますね。
なおSDKについては、旧ライブラリでは各種認識系のサンプルプログラムが掲載されていたようですが、2.0になってからはないようです。おそらく、認識系のやつはサードパーティの優秀なライブラリを使ってねということなんでしょう(OpenPoseとかOpenFaceとか)。

ソースコードとポイント
1. configの設定
ここでどのストリームを読み込むのかを設定します。解像度やフレームレートなどを決めますが、それ以外のパラメーターについてもconfigで設定するんだと思います。

2.開始後はループ処理で
pipelineクラスを呼び出してstart呼び出し後、ループでフレームを呼び出します。

3.フレームの変換
numpyのasanyarrayで配列変換。depthフレームの場合は、CV2.applyColorMapでカラーマップに変換

あとの処理は通常のOpenCVプログラミングの世界、、ということで思った以上に簡単です。C#でKinectのプログラムを書いたときは、もっと面倒だったような気がしますが。。。。
以下にサンプルを載せます。クリックで全表示です。



2020年3月3日火曜日

OpenFaceを入れてみた(Windows編)


うちは歴史的にKinect使ってモーションとか顔とかの認識をしてきたので、知識がそこで止まってしまっていたのですが、今さらOpenPoseとかOpenFaceとかCV系(画像認識系)のガチンコの方々が作られたライブラリを試すことになり、、、、いや、すごいですよ!!OpenFace!!!

公式ページはこちらっ!
OpenFaceというキーワードで調べると、
の2つが引っかかります。雰囲気的に後者のほうがCMUのラボのライブラリっぽい感じでで由緒正しいような気がしたのですが、違いました。前者のほうが現在も更新しているライブラリです。作者の方もIEEEで学会発表しているアカデミックな方で、今はMicrosoftのSenior Scientistのようです。

インストール方法
公式サイトに行くと、WIKIにいけって書いてあるのでそこへ移動します。
Windowsの場合、バイナリがあるのでそれをダウンロードして展開しましょう。単なるZIPファイルですので展開したら使えます。

モデルファイルのダウンロード
展開したら使えますと書きましたが、正確に言うと顔認識するためのモデルファイルが必要です。モデルファイルは、展開したファイルの中で
  • download_models.ps1
というPowerShell Scriptファイルを実行することで入手します。コマンドプロンプトではなく、PowerShellのコマンドプロンプトを開いて実行(上記ファイル名を入力するだけ)してください。

アプリ構成
Pythonとかのライブラリを想像していたのですが、そういうものはなく(私の勘違いでなければ)、顔画像解析のアプリケーションを提供していてそれを使ってねという感じですね。アプリは、
  • GUIアプリ系
  • コマンドラインアプリ系
と2系統に分かれている感じで、コマンドライン系のアプリは、他のプログラムから呼び出したりする時に使うのでしょう。

OpenFaceの使い方
OpenFaceOffline.exeというのがGUIアプリの記録ツールのようです。GUI系のアプリを動かすとリアルタイムに認識するんですが、想像以上に軽量ですごいです!Kinectとかで同じことをしようと思ったらマシンパワーがすごく必要で手元にあるノートPC(超ハイスペックです)でも重くてだめだったんですが、、、CV系の研究者の技術の高さには感心します。
扱うデータとしては、
  • 動画ファイル
  • イメージファイル
  • ウェブカメラ
からの入力を受け付けるようです。イメージファイルについては、ディレクトリ指定すると複数枚を一括して処理するようです。解析結果は、Processedディレクトリに保存されています。何が記録されるのかは、GUI画面のメニューで指定することができます。

なお、ソースコードを眺めると、Socket経由で呼び出すPythonのサンプルプログラムみたいなのが書いてました。そういう連携方法もあるんですね。後でチェックです。ただ、個人的には自分のGUIアプリ内でリアルタイムの処理を書きたいので、そうなるとソースコードを解読するしかないか、、、

とにかく、OpenFaceは凄いです。お試しあれ!


2020年2月28日金曜日

gist-embedを利用してGithub Gistのソースコード埋め込みをコントロールする

本サイトでは、サンプルソースコードをGitHub Gistを利用して管理することにしてますが、欠点としては、Gistのデフォルトの埋め込みコードでは、全ての行数が表示されるのがあります。これを解決するJavaScriptライブラリとして gist-embed があります。

gist-embedとは
ネットでググるといろいろ出てきますが、リンク先がリンク切れになってますね(2020/02/28現在)。で、サイトが変わってるようです。
使い方
上記サイトを見ればわかりますが、
  • Scriptタグを埋め込む
  • Codeタグを使って埋め込む (例:<code data-gist-id="******"></code>)
  • 必要に応じてオプションを指定する
    (行を指定する場合、data-gist-lineを指定すればOK)   
非常に簡単です。欠点としてはちょっと動作が遅くなるかな、、という気がするだけですね。

bloggerで設定する場合
限定的なネタになりますが、bloggerでScriptタグを埋め込みたい場合は、
  • 管理画面からテーマを選択
  • ブログで使用中のテーマを選び、編集を押す
  • 適当な場所に記述する
でOKです。


2020年2月22日土曜日

GAEにFlaskアプリをデプロイする

以前に
という記事で、zappaを利用してAWSにFlaskのウェブアプリをデプロイする手順を書きましたが、GAEだと思いの外、簡単だったので紹介します。

前提条件
  • GCP(Google Cloud Plaform)はすでに使えるように登録していて、GAEを利用するGCPのプロジェクトもすでに設定済みであることとします。(この辺りの話はどこかググってください)
  • ローカルでFlaskが動く環境を作っておきましょう
  • Google Cloud SDKもダウンロードしておいてください

サンプルプログラム
参考にしているサンプルはgitでダウンロードしてください。
  • git clone https://github.com/GoogleCloudPlatform/python-docs-samples
この中で、下記のファイルがサンプルです。
  • python-docs-samples/appengine/standard_python37/hello_world
これを用いて説明します。なお、コードは触ることはないでしょう。

ファイル構成
ここで利用するファイルは下記です
  • main.py・・・プログラム本体
  • app.yaml・・・設定ファイル
  • requirements.txt ・・・ライブラリ情報
  • libディレクトリ ・・・外部ライブラリをいれる場合に必要?
Flask関係の知識があれば、特別なファイルではないことに気づくかと思います。

デプロイ方法
とりあえず、普通のFlaskファイルなのでローカルで動くことを確認したうえで、デプロイしましょう。何も触らなくても動くはずです。コンソールで下記のGCPコマンドを打つだけです。カレントディレクトリはそのファイルがある場所に移動しておいてください。
  •  gcloud app deploy
ディレクトリ下の全てのファイルをアップしようとするので注意してください。実行は、URLを入力するか
  • gcloud app browse
を入力してください。

ちょっとGAEを再び使おうかと思ったり、、、
GAEは10年近く前に流行って、それから料金体系が改悪されて以降、個人的にあまり触らなくなり、最近はノータッチでしたが、ちょっとサーバーレス系の開発することになり、ふと思い立ったら使い勝手も良くなってました。GAEブームがまた来てもいいんじゃないでしょうか。。。


2020年2月7日金曜日

古いAccessファイル(mdbファイル)をCSVに変換する手順

※本記事はOpenOfficeを利用します。OpenOfficeは更新が止まっててセキュリティホールもあるので(今はLibreOfficeだよ)インストールはオススメできない、、、というコメントを頂きましたが、本記事で紹介する技がLibreOfficeではできませんでしたので、ご自身の責任の上で緊急的な用途としてOpenOfficeを利用されればと思います(2020/02/10)

20年ほど前の昔の研究をリバイバルすることになりまして、そのためにはデータベースに保存してある情報を使わないといけないことに気づき、、、「そういえばACCESSで作ってたなぁ。開かなかったらどうしよう(笑)」と軽い気持ちで考えてみたものの、そのままでは開かないことが明らかになり、かなり苦労したのでメモ書きです。この技もいつまで使えるのかが要注意なので、古いネタを残している人は早めに移行しておきましょう。

必要なソフト
  • OpenOffice Base
  • OpenOffice Calc
  • JRE 32bit版
Microsoftは対応していない
まず、本家のMicrosoftはACCESS97とかその辺りの古いMDBファイルを開く手段を残してません。2010年辺りの古さなら対応しているようですが。。ここは諦めましょう。

OpenOffice Baseなら開くが。。。
Microsoft Office対抗馬のOpenOfficeなら開きます。そのかわり
  • 既存のデーターベースに接続
という形式で開くことになります。ここは注意点が1つあり、この方法で開いてその後にodbファイルを保存しても、データの本体はmdbファイルにあるということです。また、Baseにはcsvで保存とかcsvで出力という機能がありません。また
  • 編集できるテーブルとかできないテーブルとかある
  • コピペとかもできない
という感じで、実質見るだけ。ちょっとつらい。

odbファイルに移植する
odbファイルとして保存し直すにはどうすればいいか。。。下の図にあるように、左側に元ファイル、右側に新規に作成したodbファイルと並べて、テーブルを手作業(ドラッグ&ドロップ)で置いていくしかないようです。データの保存状態によってはうまく移行できないかもしれません。



Office Calcに移植してcsvに保存する
odbにしたところでBaseにはcsv変換機能がないわけですから、どうすればいいかというと、Calcに頼ります。つまりCalcに読み込ませることが最終ゴールであり、Calcに読み込ませるにはデータをodbファイルとして保存しておく必要があったということです。

で、この移植作業の方法ですが、手作業です。。。下記のように、baseとCalcを並べて
  • BaseのテーブルをCalcのあるシートのセルへドラッグ&ドロップ
することで、データがペーストされます。




JRE32bit版が必要です
OpenOfficeはJavaの機能を使ってるんですかね?どうもJRE32bit版がないと、フル機能が使えないようです。64bit版ではダメですよ。

以上の方法でとりあえずデータベースを復活できそうなので、個人的にはまあ一安心なんですが。。。互換性問題、、なかなか難しいですねぇ。



2020年2月4日火曜日

Excelのルビ振り機能を有効に使う

Excelのルビ振り機能にはちょっと変わった制約があります。
  • フォントリボン→ふりがなボタンによりルビ振りを呼び出す場合、シートに直接手入力した文字でないとルビを振ってくれない。つまりコピー&ペーストした文字についてはルビを振ってくれない
  • VBAでSetphonetic関数を使用すれば、コピー&ペーストした文字についてもルビ振りが可能(ただしWindowsのみ、Macでは不可)
なんでこんな事になってるんですかね?下記はSetphonetic関数の呼び出し例です。