2017/10/30

UniServer Zero で sqlite が使えない

UniServer Zero ZIII で sqlite が使えない → php の sqlite エクステンションが有効になっていない
  1. 使用している php.iniを調べるため phpinfoを表示させる
  2. 使用している php.ini を確認→エディタで開く
  3. sqlite を検索して、利用したい extension (今回は pdo) のコメントアウトを削除
  4. Apacheを再起動する

2017/10/28

Android でゲストを削除する(ロック解除を無効にできない)

Android でゲストが存在すると、ロック解除で「なし」を選択できなくなる
ユーザーを決めずに利用しているタブレットなどで、間違ってゲストモードを起動させてしまうとロック解除が必要になってしまう

また、設定からはゲストモードを削除する方法が見当たらない
というのも、ゲストモードを削除できるタイミングは
  • ゲストモードから本人が削除を行ってログアウトさせる
  • ゲストモード切替時にデータを削除して初期状態にする
ゲストを削除するには、画面上部のバーからゲストモードへ切り替えた後、再び画面上部のバーを開くと「ゲストを削除」が表示されるようになる

または、ゲストモードへ切替時に「最初から開始」を選択すると、ゲストモードのデータを削除してロック画面へ戻るので、ロック解除を行わずに上部のバーから「ゲストを削除」する
これで、Ownerモードから設定にロック解除なしが選択できるようになる

2017/10/27

左寄せの div を中央に置く CSS

左寄せの div をページ全体でセンタリングするスタイルシート
/* CSS */
div.sotomi{
 text-align: center;
}

div.nakami{
 display: inline-block;
 text-align: left;
}

/* HTML */
<div class="sotomi" style="background-color:#eeeeff;">
 <div class="nakami" style="background-color:#ffeeee;">
  ほげほげ<br ⁄>
  ほげほげほげほげほげほげ<br ⁄>
  ほげほげ<br ⁄>
 </div>
</div>
結果

Indy TIdHttp の デフォルト useragent - Delphi/C++Builder

Indy (10系統) TIdHttp  の デフォルト useragent

Mozilla/3.0 (compatible; Indy Library)

2017/10/26

Raspberry Pi に google-home-notifier を入れた時に躓いたメモ

Raspberry Pi に google-home-notifier を入れた時にいろいろと躓いたメモ
>> 素のラズパイへ入れようとしました(一部、ディレクトリ名は伏せ字です)

【先に結論】
node.js と npm と google-home-notifier を入れる前にやっておくべき事
  • sudo ではなく su や sudo -s で root になっておくとトラブル少ないかも
  • 下記が入っていない場合は、入れておく
    # apt-get install git
    # apt-get install libavahi-compat-libdnssd-dev
これらをインストールしていないと、下記のような目にあいます
(別の素のラズパイで、上記をインストールしてからは問題なしでした)

gitが入っていなければ
# apt-get install git

こちらを参考に node.js と npm をインストール
# apt-get update
# apt-get install nodejs npm
# npm cache clean
# npm install npm n -g
# n stable

途中で README がねー とか WARN が2つほど出ますが無視(して問題無さそう)

こちら や こちら を参考に google-home-notifier をインストール
としたわけですが # npm install でエラーがドバーッっと

>>>>> /google-home-notifier# npm install
npm WARN package.json google-home-notifier@1.2.0 No repository field.
/
> mdns@2.3.3 install /hogehoge/google-home-notifier/node_modules/mdns
> node-gyp rebuild

make: Entering directory '/hogehoge/google-home-notifier/node_modules/mdns/build'
  CXX(target) Release/obj.target/dns_sd_bindings/src/dns_sd.o
In file included from ../src/dns_sd.cpp:1:0:
../src/mdns.hpp:32:20: fatal error: dns_sd.h: そのようなファイルやディレクトリはありません
 #include 
                    ^
compilation terminated.
dns_sd_bindings.target.mk:132: recipe for target 'Release/obj.target/dns_sd_bindings/src/dns_sd.o' failed
make: *** [Release/obj.target/dns_sd_bindings/src/dns_sd.o] Error 1
make: Leaving directory '/hogehoge/google-home-notifier/node_modules/mdns/build'
gyp ERR! build error
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack     at ChildProcess.onExit (/usr/share/node-gyp/lib/build.js:267:23)
gyp ERR! stack     at ChildProcess.emit (events.js:98:17)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (child_process.js:809:12)
gyp ERR! System Linux 4.9.35+
gyp ERR! command "nodejs" "/usr/bin/node-gyp" "rebuild"
gyp ERR! cwd /hogehoge/google-home-notifier/node_modules/mdns
gyp ERR! node -v v0.10.29
gyp ERR! node-gyp -v v0.12.2
gyp ERR! not ok
npm WARN This failure might be due to the use of legacy binary "node"
npm WARN For further explanations, please read
/usr/share/doc/nodejs/README.Debian

npm ERR! mdns@2.3.3 install: `node-gyp rebuild`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the mdns@2.3.3 install script.
npm ERR! This is most likely a problem with the mdns package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node-gyp rebuild
npm ERR! You can get their info via:
npm ERR!     npm owner ls mdns
npm ERR! There is likely additional logging output above.

npm ERR! System Linux 4.9.35+
npm ERR! command "/usr/bin/nodejs" "/usr/bin/npm" "install"
npm ERR! cwd /hogehoge/google-home-notifier
npm ERR! node -v v0.10.29
npm ERR! npm -v 1.4.21
npm ERR! code ELIFECYCLE
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR!     /hogehoge/google-home-notifier/npm-debug.log
npm ERR! not ok code 0

これ node が無ぇ、、、のが原因なので

# ln -s /usr/bin/nodejs /usr/bin/node

で、先ほど入れた nodejs へ node からシンボリックリンクを張ってやります
これで # npm install をやってみる・・・・ なんだか快調にスクロールしてるじゃん
あれ、なんか同じ内容を繰り返してね?→コピペーしてみる→ウギャーーループしてるだけ
(ctrl+c とかで殺します)

↓ループしてる一部
gyp WARN EACCES user "root" does not have permission to access the dev dir "/hogehoge/google-home-notifier/node_modules/mdns/.node-gyp/8.8.1"
gyp WARN EACCES attempting to reinstall using temporary dev dir "/hogehoge/google-home-notifier/node_modules/mdns/.node-gyp"
gyp verb tmpdir == cwd automatically will remove dev files after to save disk space
gyp verb command install [ '8.8.1' ]
gyp verb install input version string "8.8.1"
gyp verb install installing version: 8.8.1
gyp verb install --ensure was passed, so won't reinstall if already installed
gyp verb install version not already installed, continuing with install 8.8.1
gyp verb ensuring nodedir is created /hogehoge/google-home-notifier/node_modules/mdns/.node-gyp/8.8.1
gyp WARN EACCES user "root" does not have permission to access the dev dir "/hogehoge/google-home-notifier/node_modules/mdns/.node-gyp/8.8.1"
gyp WARN EACCES attempting to reinstall using temporary dev dir "/hogehoge/google-home-notifier/node_modules/mdns/.node-gyp"
gyp verb tmpdir == cwd automatically will remove dev files after to save disk space
gyp verb command install [ '8.8.1' ]
gyp verb install input version string "8.8.1"
gyp verb install installing version: 8.8.1
gyp verb install --ensure was passed, so won't reinstall if already installed
gyp verb install version not already installed, continuing with install 8.8.1
gyp verb ensuring nodedir is created /hogehoge/google-home-notifier/node_modules/mdns/.node-gyp/8.8.1

展開したディレクトリに権限がないのに無限にリトライしているようなので
google-home-notifier を置いたフォルダに戻って

# cd ../
# chown -R root google-home-notifier

と、持ち主を変更、再度
後で思ったのだが $ sudo -s で作業するとこうなるみたい # su で root になってから作業するべき

# cd google-home-notifier
# npm install

でなんとか入ったもよう
よしよし、テスト起動

# node example.js
module.js:515
    throw err;
    ^

Error: Cannot find module '../build/Release/dns_sd_bindings'
    at Function.Module._resolveFilename (module.js:513:15)
    at Function.Module._load (module.js:463:25)
    at Module.require (module.js:556:17)
    at require (internal/module.js:11:18)
    at Object. (/hogehoge/google-home-notifier/node_modules/mdns/lib/dns_sd.js:32:22)
    at Module._compile (module.js:612:30)
    at Object.Module._extensions..js (module.js:623:10)
    at Module.load (module.js:531:32)
    at tryModuleLoad (module.js:494:12)
    at Function.Module._load (module.js:486:3)

またまたエラー → モジュールが足りないぜ
※ su で root になってから(sudo だと またループするぜー)

# npm install --unsafe-perm mdns

エラ~ fatal error: dns_sd.h: そのようなファイルやディレクトリはありません

apt-get install libavahi-compat-libdnssd-dev
再度
# npm install --unsafe-perm mdns → 時間のかかる build へ進んでいればOK
問題なければ続けて
# npm rebuild --unsafe-perm

やっと
node example.js

起動しているっぽいので、別の ssh を開いて
$ curl -X POST -d "text=OK Google" http://127.0.0.1:8080/google-home-notifier
アドレス部は、ラズパイのアドレス

ところで、 node example.js を起動すると、サンプルが出て ngrok 経由でどこからでも使えるっぽい
※ngrok のサブドメインは起動毎に変動する

が、どこからでも使える必要がない = ngrok を使わないなら
example.js の下記の箇所をコメントアウト

var express = require('express');
var googlehome = require('./google-home-notifier');
// var ngrok = require('ngrok'); ←ココ
var bodyParser = require('body-parser');
var app = express();
// (略)
app.listen(serverPort, function () {
  /*  ココから
  ngrok.connect(serverPort, function (err, url) {
    console.log('POST "text=Hello Google Home" to:');
    console.log('    http://localhost:' + serverPort + '/google-home-notifier');
    console.log('    ' +url + '/google-home-notifier');
    console.log('example:');
    console.log('curl -X POST -d "text=Hello Google Home" ' + url + '/google-home-notifier');
  });
  ココまで
  */
})


2017/10/25

「【楽天カード】ご請求予定金額のご案内」 マルウェアリンクのURL

下記の件名などで届く、マルウェアリンクを記載した楽天カードを偽装したメール

【楽天カード】ご請求予定金額のご案内
【重要】カスタマセンターからのご案内【楽天カード株式会社】
口座振替日のご案内【楽天カード株式会社】(楽天カード)

記載のリンクは、だいたい下記のような形式で、パスはランダムな数字だが何処を開いても(ルートでも)これらのドメイン配下は、同じ「料金明細をチェック.zip」のダウンロードとなる
(www のサブドメインはフツーのサイトなので、Wordpressやファイルマネージャーを乗っ取られて、踏み台にされている様子)

http://se.artlyticalmedia.com/zzzzzzz0000000/zzzzzzz0000000zzzzzzz0000000/zzzzzzz0000000
http://gw.hexadecicolors.com/zzzzzzz0000000/zzzzzzz0000000zzzzzzz0000000/zzzzzzz0000000
http://de.davidrhoderick.com/zzzzzzz0000000/zzzzzzz0000000zzzzzzz0000000/zzzzzzz0000000
http://fr.hexadecicolors.com/zzzzzzz0000000/zzzzzzz0000000zzzzzzz0000000/zzzzzzz0000000

これらにマッチする正規表現
http:\/\/[a-z][a-z]\.[^\/]+\/[a-z]+[0-9]+\/[a-z]+[0-9]+[a-z]+[0-9]+\/[a-z]+[0-9]+

また、サブドメインが 2文字という特徴があるので
http:\/\/[a-z][a-z]\.
だけでも良いかもしれません

他に User-Agent ヘッダに
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0
が含まれている特徴もあります

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 (Oreo) 前後ショートカット作成方法の違い - 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("ショートカット名"));

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

2017/10/05

Amazon Prime 会員向けに読み放題サービス開始

読み放題サービス Prime Reading 開始

家族会員のアカウントにもメールが到着しているが、家族会員が利用できるかは不明(Video等も利用できないので、おそらく不可)


まぁ、Videoとか有るくらいだから、読み物もあって当然かも

WebView の Basic認証 NG時にリトライさせたい - Android Studio

WebView の Basic認証をダイアログ表示させるものの、入力情報が間違っていてもリトライしてくれない

認証エラーは onReceivedHttpError イベントの errorResponse.getStatusCode() == 401 を拾うことで捕捉可能ですが、ページを初めて開いた時も同じ401のイベントが発生するので注意が必要です

下記では authRun をダイアログ入力直後とするフラグを設けて onPageFinished や onReceivedError で解除を行っていますが、もっとスマートな方法は無いものだろうか...

@Override
@TargetApi(Build.VERSION_CODES.M)
public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
      super.onReceivedHttpError(view, request, errorResponse);
      if( request.isForMainFrame() && (errorResponse.getStatusCode() == 401) && authRun ){
        authRun = false;
      view.reload();
      }
}

【追記】
上記コードは Android 6.0 (API 23) 以降用でで、それ以前は 同名のイベントが存在するものの...
            
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { // < API 23
      super.onReceivedError(view, errorCode, description, failingUrl);

}

これが全く使えないイベントで 401時に呼ばれるはするものの errorCode に -1 が入っていたりして判断できるものが全くありません

Basic認証しているということで onReceivedHttpAuthRequest を利用していると思いますが
@Override
public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {
    if( (view != null) && handler.useHttpAuthUsernamePassword() ){
    
    }
}
Android 6.0 (API 23) 以前(4.1で確かめただけで、全て確かめてません)では、認証失敗時(401)にこのイベントが再度呼ばれるようで、しかも handler.useHttpAuthUsernamePassword() に false が入った状態(爆)もぅねぇ
handler.useHttpAuthUsernamePassword() || authRun とかでとりあえず逃げておいたけど、バージョンで分けるのが正しい方法だと思います

ちなみに、onReceivedHttpAuthRequest には別の落とし穴もあるようで、
ユーザーとパスワードをURL埋め込んで、かつ認証情報が間違っていた場合、このイベント内でいくら正しい認証情報を入れ直したとしても、URLの埋め込みを利用されて全く認証が完了しなかったりします
なので、load時に埋め込み認証情報を分離して、このイベントで投入し直すという方法を取りました


2017/10/04

ClosedXML.dll の入手

ClosedXML.dll の入手について友人から聞かれたのでメモ
  • ClosedXMLは旧公式サイトから GitHubへ移動
  • バイナリDLLがダウンロードできるのは、旧サイトのDownloadsページ の右の方
    (ここでは、0.75.0までのバイナリがダウンロードできるらしい)
  • 上記より新しいバイナリは、GitHubのソースからコンパイルしなさい

GitHubのソースからコンパイル手順
  1. ClosexXML(GitHub) 右の Clone or download から zip ファイルをダウンロードして解凍
  2. Zipファイル内の ClosedXML.sln を Visual Studio (今回は 無料の 2015 Community)で開く
  3. ソリューションをビルド(注意・デフォルトで他のプロジェクトが選択されている場合がある)
  4. ClosedXML-develop\ClosedXML\bin\Debug や ClosedXML-develop\ClosedXML\bin\Release に ClosedXML.dll や DocumentFormat.OpenXml.dll が生成される
    FastMember.Signed.dll は何でしょう??




2017/10/03

Button のイベントを発生させる - Android Studio

ボタンのタップイベントを呼び出す

((Button)findViewById(R.id.myButton)).callOnClick();

Android ProgressBar の setAlpha は 0~1

Android で ProgressBar の setAlpha 設定を行ったメモ

setAlpha の引き数 0~255 のパーツが多いみたいですが
ProgressBarsetAlpha0(透明)~1(透過なし) の float 指定

progressBar.setApha(0.5f) とかです

2017/10/02

Android ProgressBar のクルクルが環境によって表示されない

Android の ProgressBar のクルクル(砂時計というのも古いのか)が実行環境によって表示されない
開発者向けオプションの「Animator再生時間」がオフになっていると、そのものが表示されません
また、クルクルの速度はここの設定が反映されますが、あまり遅い 2x等にすると、ホーム画面のフォルダがモッサリしたりします

Android Studio で AdMob 導入手順が簡単になっていた

SDKの容量がものすごいことになり(200GB)ついでに、Android Studio 2.3.3 を再インストールした環境で、久々に AdMob を利用しようとしたら、かなりやり方が変わっていたのでメモ

AdMob にサインインして、広告ID(ca-app-pub-XXXXXXXXX みたいなの)を受け取るのは同じです

上記取得で、
Google Mobile Ads SDK をダウンロードしてください。と出ますがリダイレクトループでダウンロードできませんし、よく手順解説で見かける google-services.json へのダウンロードリンクもなくなってます

という事で
プロジェクトへの追加
File - Project Structure を開いて、Ads の AdMob にチェックを入れて OK を押すだけ

必要なものがダウンロード?され build.gradle に項目が追加されます(たぶん)

あとは

AndroidManifest.xml に権限を追加(無ければ)
    <uses-permission android:name="android.permission.INTERNET">
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE">

レイアウトに広告ブロックを追加
        <com.google.android.gms.ads.AdView
            android:id="@+id/adView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_alignParentBottom="true"
            ads:adSize="BANNER"
            ads:adUnitId="ここに取得したIDを入れる">
        </com.google.android.gms.ads.AdView>
       
アクティビティの super.onCreate 等に下記の広告ロードを追加
        AdView mAdView = (AdView) findViewById(R.id.adView);
        AdRequest adRequest = new AdRequest.Builder().build();
        mAdView.loadAd(adRequest);

そんな感じでした