2017/10/20

Android向け Microsoft の ホームアプリと Edge

Android向け Microsoft の ホームアプリEdge がリリースされ、ホームアプリはなかなかの高評価、これで bing 利用者も増えるかも??
一方の Edge は、レンダリングエンジンは独自の Trident ではなく blink
使ってみた所、軽快さがない・・・プレビュー版だから?
Windows で Edge 使ってる人のみにオススメな感じか

Google Home(Assistant) での独自コマンド所感

Google Home(Assistant) で独自コマンドを色々作ってみた所感


一発物の命令と応答
「ok,google テレビつけて」みたいなの

IFTTT で this に Google Assistant that に Webhook を選択するだけ、だが this→thatが一方通行なため、Web等からのレスポンスを Assistant へ反映できない

具体的には this の Google Assistant で文字や数値を入れるタイプを選択した場合 $ を入れた所が、変化する場所(例「お父さんに $ とメールして」)で、レスポンス(例「お父さんに $ とメールしました」)には $ が使えるのみ
一方 that の Webhook では $ → {{TextField}} という置換文字を post したりして Webへ送り出すことは出来る。ただし、ここでのWebレスポンスを先程の、レスポンスに使うことが出来ない

チャット形式のアプリ型
「ok,google リモコンにつないで」みたいなので、リモコンアプリに接続(そっから先は、アプリから抜けるまで、アプリとの対話になる)
詳細な流れはコチラ


上記だと、レスポンスを変えられないので物足りない
下記だと、大掛かりすぎるというかチャットを抜けるまで対象アプリとの会話になり、自然終了しない

ちなみに連携サービス IFTTT, Microsoft Flow, Zaiper のうち、Google Assistant に対応するのは今のところ IFTTT のみ

これ IFTTTができてるんなら、直接 Google Assistant とやり取りできるんじゃないかと思うのだが、誰かおせーてー

google_accounts_daemon: Google Compute Engine OS Login is not active. の謎ログ(未解決)

Google Cloud Platform で VM を作り直した(Centos7)ところ messages ログへ1分毎に下記が記録される

google_accounts_daemon: Google Compute Engine OS Login is not active.

SELinux の無効を有効に戻しても、関係なく記録され続け...
いつから記録されているかと遡ってみたら、マシンを構築してすぐ、私がまだ最初にログインする前から既に記録されていた...

とりあえず

# systemctl stop google-accounts-daemon.service
# systemctl disable google-accounts-daemon.service

なんかで逃げてみたけど、他に影響出ないだろうか...

そういえば、このサーバを作成し直した原因が yum update で google~ みたいなアップデートで反応がなくなって、再起動しても cpu使用率100%のまま起動不能になったことだった
詳しく調べずにマシンを作成し直したワケだが、google~daemonに問題ありなのかも

正規表現で最後のスラッシュまでを取得

正規表現でURL等の最後のスラッシュまでを取得

var urlSrc = 'http://example.com/hoge/fuga/index.html';
var urlPth = urlSrc.match(/.+\//); // ← http://example.com/hoge/fuga/

2017/10/19

Let's Encrypt + さくらレンタルサーバー OSブラウザ別 .htaccess

Let's Encrypt にさくらのレンタルサーバーが対応したので、リダイレクト用 .htaccess を書いたメモ

非対応のブラウザ等はリダイレクトしないという感じの記述です
本来はガラケーとかも考慮すべきかもしれませんが、下記ではしてません

Let's Encrypt 総合ポータル と userAgent一覧 を参考に、iOS, Android, Internet Explorer の旧バージョンをザックリと対象外に

RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} !iPhone\ OS\ [2-3]\_
RewriteCond %{HTTP_USER_AGENT} !Android\ [1-2]\.
RewriteCond %{HTTP_USER_AGENT} !MSIE\ [4-9]\.
RewriteCond %{HTTP:X-SAKURA-FORWARDED-FOR} ^$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

改行を LF で記述

2017/10/17

IFTTT で "Push Notifications failed to update" と表示されて通知をオフにできない

IFTTT で Applet の通知をオフ or オン しようとすると "Push Notifications failed to update" とポップアップ表示されて通知を変更できない

Applet を turned off で無効化した後、設定変更を行う

2017/10/16

IFTTTで Maker (Maker Channel)が見つからない

IFTTTで Maker (Maker Channel) を検索しても表示されない → Webhooks を使え
(配置などは同じなので、Maker Channel を例にしたサイトを参考に利用できます)
https://ifttt.com/maker のリンクも https://ifttt.com/maker_webhooks へ飛ばされます


2017/10/13

Google Home の設定に必要なアプリが動作する Android および iOS バージョン

Google Home (mini含む) の設定に必要なアプリケーションが動作する Android および iOS バージョン が見つけられにくかったのでメモ

PCではいずれも設定不可、せめてChromeブラウザ拡張でできるようになれば便利だけど、初期の Wi-Fi 接続設定が困難ですな

-->
OSバージョン
Android4.4 以降
iOS9.1+ 以上
Windows設定不可
Mac OSX設定不可

【参考】
Google Home および Google Home Mini を使用するための OS の最小要件

2017/10/10

Google Home の独自コマンドを PHP から応答

Google Home(Assistant) の独自コマンドを PHP(Webサーバ) から応答させたときのメモ

【注意】
ここで使用する独自コマンドは、Google Home から独自コマンドが搭載された自作アプリへ接続して、会話を行うような利用方法です。ok,google に続いて一発ものの命令を行う場合 IFTTT を利用するほうが容易です

基本的な流れはこちらを参考にさせていただきました
上記は例が python + Flask なので既存のサーバへ受け渡すのとはちょっと違ったのでPHPの場合を捕捉

大まかな流れ等
  1. DialogFlow のアカウントを有効にするGoogleサインアップがフツーかもGoogle傘下なので
  2. Agentを作成(この中に intent を複数作成していく)
  3. Intentを作成(音声命令 = intent な感じです)
    解説に有る Fulfillment のチェックボックスが見つからないのは、Fulfillment が定義されていないからです。Fulfillmentを定義すると出現します
  4. Entities は音声命令を節毎に分離して汎用性を高められます
    テレビ電源 入れて」の各節を TV とか パワーとか オンして みたいなゆらぎを入れてクロスでマッチしてくれたりします(後で intent に組み込めるのでテストでは飛ばしてもOK)
  5. Fulfillment で呼び出す URLを指定
    ここのURLは Agentと対になり Intent の Action が送られてきますので、URLが違えば Agent も違うという事になる
Intent が音声等で選択されると Fulfillment で指定されたURLへ json形式のデータが送られてきて、レスポンスも json形式で返すことになります

PHP の場合、こちらの 形式で応答(Action の sayHello が該当の箇所)

また、送られてくる json は、DialogFlowの右側にある「try it now」からコマンドを入力して、一番下の show json で確認できるので、ファイルに保存して
上の
$update_response = file_get_contents("php://input");
$update_response = file_get_contents("filename.json");
としてデバッグするとわかりやすいです

最終的な動作確認は、Webを持っていれば Integrations の WebDemo をオンにして、

表示される iframe をHTMLで貼り付けてれば確認可能です

動作の流れ
「○○につないで」で、テストアプリに接続してチャットを行う感じです
チャットを終了させるコマンドを用意していないと戸惑います
  • スマートフォンであれば上部の×でチャットを閉じる
  • Google Home であれば、上部中央をタッチする
  • 先程の intent で終了コマンドを作成しておく ←コレがあると親切
の3通りがあります(たぶん)
「ありがとう」や「さようなら」という言葉で、最下部の End conversation にチェックを付けると、終了intentを作成しておきます

2017/10/06

Android 8.0 前後ショートカット作成方法の違い - Android Studio

Android 8 (O) API26 からショートカットの作成方法が変わったのでメモ

String shortcutName = "Shortcut Name";
Intent  shortcutIntent = new Intent(Intent.ACTION_MAIN);
        shortcutIntent.setClassName(this, "com.example.myApplication"); // 呼び出すActivity
        shortcutIntent.putExtra("key1", "value1"); // 渡す情報()
        shortcutIntent.putExtra("key2", "value2");

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    // Android 8 O API26 以降
    Icon icon = Icon.createWithResource(getApplicationContext(), R.mipmap.ic_shortcut);
    ShortcutInfo shortcut = new ShortcutInfo.Builder(getApplicationContext(), shortcutName)
            .setShortLabel(shortcutName)
            .setLongLabel(shortcutName)
            .setIcon(icon)
            .setIntent(shortcutIntent)
            .build();

    ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
                    shortcutManager.requestPinShortcut(shortcut, null); // フツーのショートカット
                    // shortcutManager.addDynamicShortcuts(Arrays.asList(shortcut)); // ダイナミックショートカット
} else {
    // Android 7 Nougat API25 以前
    Parcelable icon = Intent.ShortcutIconResource.fromContext(this, R.mipmap.ic_shortcut);
    Intent  intent = new Intent();
            intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, shortcutName);
            intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
            intent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
            this.sendBroadcast(intent);
}

ダイナミックショートカットは、アプリアイコンをうにゅっと押し続けて4つくらいまで表示されるショートカットの事です(iPhoneでいう3D Touch のクイックアクション)

requestPinShortcut の第2引き数はショートカット作成後のイベントらしいです、エミュレータでは requestPinShortcut 処理後にOSからショートカット作成確認のダイアログが出てましたので、作成が完了したかどうかなんかが受け取れるのかも(未確認)

// 一覧取得
ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
List shortcutList = shortcutManager.getDynamicShortcuts();
for (int i = 0; i < shortcutList.size(); i++) {
 shortcutList.get(i);
}

// 削除
ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
    shortcutManager.removeDynamicShortcuts(Arrays.asList("ショートカット名"));

ダイナミックショートカットを操作できるのは該当アプリケーションのみです
また、(操作の話ですが)ダイナミックショートカットを長押しして、フツーのショートカットとしてコピーする事が出来ます