Gmail から さくらレンタルサーバー のメールを SSL で POP3 で受信するメモ
POPサーバ: さくらの初期ドメインでドメインを記載 ←重要
ポート番号: 995
メールの取得にセキュリティで保護された~ にチェックを入れる
2017/12/26
2017/12/18
2017/11/29
PHP の PDO で debugDumpParams の出力をファイルなどに保存
SQL の実行結果を確認しようにも bindValue や bindParam を使っていると、実行内容を取得できない
debugDumpParams を利用すると SQL へ渡った情報を標準出力に吐き出すことが出来る
その内容をファイルなどに保存する
通常は execute() の直後に debugDumpParams() を呼び出せば、標準出力に吐き出されますが
ob_start(関数名) で、内容をコールバック関数へ渡しています。今回は 標準出力へ表示する必要が無いので、ob_end_clean() を用いていますが、callback の戻り値を出力する場合は ob_end_flush() を利用します。
debugDumpParams を利用すると SQL へ渡った情報を標準出力に吐き出すことが出来る
その内容をファイルなどに保存する
$stmt->execute();
if( ob_start('callback') ){
try{
$stmt->debugDumpParams();
}finally{
// ob_end_flush();
ob_end_clean(); // callback からの戻り値を出力しない
}
}
function callback($buffer){ file_put_contents('sqlresult.txt', $buffer); return $buffer; }
function callback($buffer){ file_put_contents('sqlresult.txt', $buffer); return $buffer; }
通常は execute() の直後に debugDumpParams() を呼び出せば、標準出力に吐き出されますが
ob_start(関数名) で、内容をコールバック関数へ渡しています。今回は 標準出力へ表示する必要が無いので、ob_end_clean() を用いていますが、callback の戻り値を出力する場合は ob_end_flush() を利用します。
$stmt->execute();
if( ob_start('callback') ){
try{
$stmt->debugDumpParams();
}finally{
ob_end_flush(); // callback からの戻り値を出力する
// ob_end_clean();
}
}
function callback($buffer){ file_put_contents('sqlresult.txt', $buffer); return $buffer; // return ''; にすると ob_end_clean() を使用したのと同じ }
function callback($buffer){ file_put_contents('sqlresult.txt', $buffer); return $buffer; // return ''; にすると ob_end_clean() を使用したのと同じ }
2017/11/27
PHP の call_user_func_array + bind_param で参照渡し
call_user_func_array で mysqli の bind_param を呼び出しをまとめつつ、汎用性をもたせたい
bind_param は 第2引き数以降が参照渡しでなければならないので、渡す配列を作成する段階で参照渡しを入れておく必要があるが、毎回面倒なので配列を再生成することで落ち着く
ここで $params を作成する時に
foreach($data as $key => $value){ $params[] = &$value }
の様に行ってはいけません
上記は $value 参照を代入することになり、次のループで $value が書き換えられ、結果的に配列の最後の値を全てが参照することになります
foreach($data as $key => $value){ $params[] = &$data[$key] }
であれば、元の $dataが書き換えられない限り、データの変動は起こりません
bind_param は 第2引き数以降が参照渡しでなければならないので、渡す配列を作成する段階で参照渡しを入れておく必要があるが、毎回面倒なので配列を再生成することで落ち着く
// 警告が出るパターン
// Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference, value given in
$params = array('i', 2);
call_user_func_array(array($stmt, 'bind_param'), $params);
// 引き数を意識するパターン
$id = 2;
$params = array();
$params[] = 'i';
$params[] = &$id; // パラメータは参照渡し
call_user_func_array(array($stmt, 'bind_param'), $params);
// お手軽なパターン
$params = array('i', 2);
for($i = 1; $i < count($params); $i++){ // 2番目以降を参照渡しに書き換え
$params[$i] = &$params[$i];
}
call_user_func_array(array($stmt, 'bind_param'), $params);
ここで $params を作成する時に
foreach($data as $key => $value){ $params[] = &$value }
の様に行ってはいけません
上記は $value 参照を代入することになり、次のループで $value が書き換えられ、結果的に配列の最後の値を全てが参照することになります
foreach($data as $key => $value){ $params[] = &$data[$key] }
であれば、元の $dataが書き換えられない限り、データの変動は起こりません
ラベル:
call_user_func_array,
PHP,
参照渡し
2017/11/21
Nintendo Switch を Amazon から3時間くらいで購入したメモ
Nintendo Switch を転売屋の餌食にならず Amazon から3時間くらいで購入したメモ
ただし、サンタさんの手柄
転売屋対策なのか Amazonでは switch 本体のみよりも、ポーチやダウンロード版との組み合わせの方が、入荷が多いような気がします
ポーチやマリオオデッセイ等、いずれ購入する予定があれば、それらの抱合せ商品を狙うと、より容易に購入できると思われます
ちなみに、switch本体に30GB程度のメモリ空き領域があるので、いくつかのダウンロード版を利用するのであれば SDカードは無くても利用可能です
下準備
購入編
本体の商品構成
ただし、サンタさんの手柄
転売屋対策なのか Amazonでは switch 本体のみよりも、ポーチやダウンロード版との組み合わせの方が、入荷が多いような気がします
ポーチやマリオオデッセイ等、いずれ購入する予定があれば、それらの抱合せ商品を狙うと、より容易に購入できると思われます
ちなみに、switch本体に30GB程度のメモリ空き領域があるので、いくつかのダウンロード版を利用するのであれば SDカードは無くても利用可能です
下準備
- スマホに Twitter アプリを入れて、通知の設定をする
- Twitter の switch販売速報bot 等をフォローして、モバイル通知をオンにする
- Amazonで switchの商品構成と価格をチェック
- Amazon で 1-Click注文 を有効にする
購入編
- 購入したい商品のページを開いておく(候補が複数あればそれらも)
- スマホの Twitter アプリでプッシュ通知がくる
【重要】ここで、商品が何かをTwitter画面で確認するのは時間の無駄です - 購入したい商品のページをリロード、金額とAmazonが販売していることを確認
- 1-Click注文 → NG or 注文完了
- あとは、2~4 を繰り返す
本体の商品構成
- 本体のみ
- 本体 + ポーチ等
- 本体 + ソフト
ラベル:
Amazon,
Nintendo switch
2017/11/16
Firefox 57 Quantum アップデート開始
2017/11/14
Python ディクショナリの keys や values の順序
2017/11/13
Python コメント coding:utf-8 の記述位置
Python + apache で UTF8の情報を扱っていたら SyntaxError: Non-ASCII character のエラーが多発、どうも
# -*- coding: utf-8 -*-
#!~/python
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
の記述位置が悪かったようで
途中に記述していたコメントを移動させて#!~/python
# -*- coding: utf-8 -*-
pythonのパスが先頭、次の行にcodingを記述したら動作するようになった
マジックコメントって必要な場所より上にあればいいと思っていた・・・
Firefox アドオンの Stylish がついにアップデートされて Chromeと同じ仕様に
Firefox アドオンの Stylish がついにアップデートされて Chromeと同じ仕様になった
閲覧サイトの送信問題とかいろいろあるわけですが
少し前から、Firefox版も URL同期が使えなくなり不便になっていましたが、結局 Chromeと不完全にもjson形式のエクスポートファイルが共通になりました
で、不完全なのは Chromeでエクスポートしたファイルに ANSI以外を含む場合、Firefox側でインポートすると文字化けします
また、Firefoxでエクスポートした際にファイル名が謎なのと、改行が殆ど無いエクスポートファイルになり、まだまだ不完全な感じが強いです
閲覧サイトの送信問題とかいろいろあるわけですが
少し前から、Firefox版も URL同期が使えなくなり不便になっていましたが、結局 Chromeと不完全にもjson形式のエクスポートファイルが共通になりました
で、不完全なのは Chromeでエクスポートしたファイルに ANSI以外を含む場合、Firefox側でインポートすると文字化けします
また、Firefoxでエクスポートした際にファイル名が謎なのと、改行が殆ど無いエクスポートファイルになり、まだまだ不完全な感じが強いです
2017/11/10
Python で可変長引数を関数の戻り値で返す
Python で可変長引数を関数の戻り値で返す
利用側で **
def db_connect_config():
return {'user':'root', 'password':'passwd', 'host':'localhost', 'database':'myDB'}
# :::
conn = mysql.connector.connect(**db_connect_config())
利用側で **
Python で日本語を含む MySQL の select 結果を json で出力
Python で日本語を含む MySQL の select 結果を json で出力する最小限のコードをメモ
Python2.7系
Python2.7系
#!~\python2.7
# -*- coding: utf-8 -*-
# utf8 output
import sys
import codecs
sys.stdout = codecs.getwriter('utf_8')(sys.stdout)
# header
print("Content-type: text/plain; charset=utf-8")
print("")
# mysql
import mysql.connector
import json
conn = mysql.connector.connect(user='root', password='passwd', host='localhost', database='myDB')
cur = conn.cursor(dictionary=True)
try:
cur.execute("select * from myTable;")
rows = cur.fetchall()
print(json.dumps(rows, ensure_ascii=False))
finally:
cur.close()
conn.close()
- sys.stdout = codecs.getwriter('utf_8')(sys.stdout) で出力を UTF8に
- cursor で dictionary=True を指定することで、fetch内容に列名が入ってくるので jsonで利用しやすくなります
MySQLdb を利用している場合は、cursor(MySQLdb.cursors.DictCursor) - json.dumps で ensure_ascii=False を入れないと、"\u4e0d\u660e" みたいに ASCII以外を Unicodeエスケープされてしまいます
#!~\python3
# -*- coding: utf-8 -*-
# utf8 output
import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
# header
print("Content-type: text/plain; charset=utf-8")
print("")
# mysql
import mysql.connector
import json
conn = mysql.connector.connect(user='root', password='passwd', host='localhost', database='myDB')
cur = conn.cursor(dictionary=True)
try:
cur.execute("select * from myTable;")
rows = cur.fetchall()
print(json.dumps(rows, ensure_ascii=False))
finally:
cur.close()
conn.close()
2017/11/09
Python の mysql.connector.connect でカラム名を取得
Python の mysql.connector.connect でカラム名を取得
cursor の引き数に dictionary=True を入れる
cursor の引き数に dictionary=True を入れる
cur = conn.cursor(dictionary=True)が、カラムの並びが???→宿題
Visutl Studio Code で Python だけタブを4スペースにする
Visutl Studio Code のタブ動作をデフォルトのスペースからタブに変更しているが、Pythonは4スペースにしたい
- Ctrl + Shift + P → Preferences: Configure language specific settings
- Python(下の方)を選択するか入力
- 表示されるpython設定に "editor.insertSpaces": true と "editor.tabSize": 4 を追加
{
"workbench.welcome.enabled": false,
"files.autoSave": "off",
"editor.insertSpaces": false,
"typescript.check.npmIsInstalled": false,
"python.linting.enabledWithoutWorkspace": false,
"editor.renderWhitespace": "boundary",
"[python]": {
"editor.insertSpaces": true,
"editor.tabSize": 4
}
}
ラベル:
python,
Visual Studio Code
UniServer(Uniform Server) Zero で Python を動かす
簡単に Apache + PHP + MySQL の環境が作れる UniServer Zero で Python を動かしたメモ
- Pythonをダウンロード + インストール
必要によって python.exe ディレクトリへパスを通す(cgiとしては通す必要ないです)
インストールディレクトリ\PythonXX\ やら \PythonXX\Scripts に通しておくと便利です - UniServerZ\core\apache2\conf\httpd.conf を開く
- py拡張子でスクリプト動作させる場合 httpd.conf の
AddHandler cgi-script .cgi
↓
AddHandler cgi-script .cgi .py - wwwフォルダでも cgi を動作させる場合 httpd.conf の
<Directory "${US_ROOTF_WWW}"> を探して
Options Indexes Includes
の下に
Options +ExecCGI
を書き加える
test.py なんかを作って置いてみる※pythonのパスはそれぞれで
#!C:\Python27\python.exe print("Content-type: text/plain") print("") print("Hello Python World!")
2017/11/08
Amazon Echo 日本発売(米国での発売時期)
Amazon Echo が日本国内でも発売されたが、本国での発売時期は歴史が古いだけあってかなり前だったりする
まぁ、ハードウェアよりソフトウェアが要なので、それほど気にしなくていいのかもしれないけど、サポート終了の時期が気になりますな
国内で発売された Amazon Echo は、デザインから米国の Echo 2 と思われるが、色の数などが本国と違っている
Amazon Echo 米国発売時期
ちなみに後発の Google Home は
まぁ、ハードウェアよりソフトウェアが要なので、それほど気にしなくていいのかもしれないけど、サポート終了の時期が気になりますな
国内で発売された Amazon Echo は、デザインから米国の Echo 2 と思われるが、色の数などが本国と違っている
Amazon Echo 米国発売時期
タイプ | 米国発売 |
Echo Dot | 2015/06/23 |
Echo (2nd gen) | 2017/10/31 |
Echo Plus | 2017/10/31 |
ちなみに後発の Google Home は
タイプ | 米国発売 |
Google Home | 2016/11/04 |
Google Home Mini | 2017/10/19 |
ラベル:
Amazon echo,
Google Home,
米国
2017/11/07
Raspberry Pi OS書き込みメモ(SD初期化, SSH有効化, ログイン, ホスト名)
Raspberry Pi の SDを初期化して、再セットアップした時のメモ
Raspberry Pi で使用していた SD の初期化 → Raspberry Pi 用のSDカードを初期化する方法
Raspbian OS イメージ ダウンロード
OSイメージの書き込み → Win32 Disk Imager
初期でSSH有効のための空ファイル設置場所( /boot/ssh )

ログイン情報
-->
コンフィグ
$ sudo raspi-config
Raspberry Pi で使用していた SD の初期化 → Raspberry Pi 用のSDカードを初期化する方法
Raspbian OS イメージ ダウンロード
OSイメージの書き込み → Win32 Disk Imager
初期でSSH有効のための空ファイル設置場所( /boot/ssh )

ログイン情報
-->
ホスト | raspberrypi.local |
ユーザー | pi |
パスワード | raspberry |
コンフィグ
$ sudo raspi-config
ラベル:
raspberry pi,
ssh
2017/11/03
Dialogflow + Actions on Google で作成したアプリが「Sorry, this action is not available in simulation」
Dialogflow + Actions on Google で作成したアプリがいつの間にか呼び出せなくなっていて、エミュレータから呼び出しても「Sorry, this action is not available in simulation」と表示されて起動しない
エミュレータ画面から、CHANGE VERSION を押して、バージョンを更新する
エミュレータ画面から、CHANGE VERSION を押して、バージョンを更新する

2017/11/02
bit.ly の spam報告先
url短縮サービス bitly(bit.ly) を利用した spam が多い事と、spamに対して全く対応していないのでは?と思われるため、うちでは bit.ly のリンクを含む == spam 扱いで完了していますが
一応、 bit.ly 利用 spam リンクの報告先
メールで support@bitly.com へ、件名に spam を含め、本文に受け取った状況と問題のリンクを記入しろ
だそうです↓
https://support.bitly.com/hc/en-us/articles/231247908-I-ve-found-a-bitlink-that-directs-to-spam-what-should-I-do-
一応、 bit.ly 利用 spam リンクの報告先
メールで support@bitly.com へ、件名に spam を含め、本文に受け取った状況と問題のリンクを記入しろ
だそうです↓
https://support.bitly.com/hc/en-us/articles/231247908-I-ve-found-a-bitlink-that-directs-to-spam-what-should-I-do-
2017/10/30
2017/10/28
Android でゲストを削除する(ロック解除を無効にできない)
Android でゲストが存在すると、ロック解除で「なし」を選択できなくなる
ユーザーを決めずに利用しているタブレットなどで、間違ってゲストモードを起動させてしまうとロック解除が必要になってしまう
また、設定からはゲストモードを削除する方法が見当たらない
というのも、ゲストモードを削除できるタイミングは
または、ゲストモードへ切替時に「最初から開始」を選択すると、ゲストモードのデータを削除してロック画面へ戻るので、ロック解除を行わずに上部のバーから「ゲストを削除」する
これで、Ownerモードから設定にロック解除なしが選択できるようになる
ユーザーを決めずに利用しているタブレットなどで、間違ってゲストモードを起動させてしまうとロック解除が必要になってしまう
また、設定からはゲストモードを削除する方法が見当たらない
というのも、ゲストモードを削除できるタイミングは
- ゲストモードから本人が削除を行ってログアウトさせる
- ゲストモード切替時にデータを削除して初期状態にする
これで、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)
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 を入れる前にやっておくべき事
(別の素のラズパイで、上記をインストールしてからは問題なしでした)
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 でエラーがドバーッっと
これ node が無ぇ、、、のが原因なので
# ln -s /usr/bin/nodejs /usr/bin/node
で、先ほど入れた nodejs へ node からシンボリックリンクを張ってやります
これで # npm install をやってみる・・・・ なんだか快調にスクロールしてるじゃん
あれ、なんか同じ内容を繰り返してね?→コピペーしてみる→ウギャーーループしてるだけ
(ctrl+c とかで殺します)
↓ループしてる一部
展開したディレクトリに権限がないのに無限にリトライしているようなので
google-home-notifier を置いたフォルダに戻って
# cd ../
# chown -R root google-home-notifier
と、持ち主を変更、再度
後で思ったのだが $ sudo -s で作業するとこうなるみたい # su で root になってから作業するべき
# cd google-home-notifier
# npm install
でなんとか入ったもよう
よしよし、テスト起動
# node example.js
またまたエラー → モジュールが足りないぜ
※ 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 の下記の箇所をコメントアウト
>> 素のラズパイへ入れようとしました(一部、ディレクトリ名は伏せ字です)
【先に結論】
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
やっと
起動しているっぽいので、別の 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'); }); ココまで */ })
ラベル:
Google Home,
node.js,
raspberry pi
2017/10/25
「【楽天カード】ご請求予定金額のご案内」 マルウェアリンクのURL
下記の件名などで届く、マルウェアリンクを記載した楽天カードを偽装したメール
【楽天カード】ご請求予定金額のご案内
【重要】カスタマセンターからのご案内【楽天カード株式会社】
口座振替日のご案内【楽天カード株式会社】(楽天カード)
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
また、サブドメインが 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
が含まれている特徴もあります
【楽天カード】ご請求予定金額のご案内
【重要】カスタマセンターからのご案内【楽天カード株式会社】
口座振替日のご案内【楽天カード株式会社】(楽天カード)
記載のリンクは、だいたい下記のような形式で、パスはランダムな数字だが何処を開いても(ルートでも)これらのドメイン配下は、同じ「料金明細をチェック.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
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 とやり取りできるんじゃないかと思うのだが、誰かおせーてー
一発物の命令と応答
「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 とやり取りできるんじゃないかと思うのだが、誰かおせーてー
ラベル:
API.AI,
DialogFlow,
Google Home,
IFTTT,
webhook,
自作コマンド
google_accounts_daemon: Google Compute Engine OS Login is not active. の謎ログ(未解決)
Google Cloud Platform で VM を作り直した(Centos7)ところ messages ログへ1分毎に下記が記録される
SELinux の無効を有効に戻しても、関係なく記録され続け...
いつから記録されているかと遡ってみたら、マシンを構築してすぐ、私がまだ最初にログインする前から既に記録されていた...
とりあえず
# systemctl stop google-accounts-daemon.service
# systemctl disable google-accounts-daemon.service
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に問題ありなのかも
そういえば、このサーバを作成し直した原因が yum update で google~ みたいなアップデートで反応がなくなって、再起動しても cpu使用率100%のまま起動不能になったことだった
詳しく調べずにマシンを作成し直したワケだが、google~daemonに問題ありなのかも
ラベル:
Centos7,
Google Cloud Platform
正規表現で最後のスラッシュまでを取得
正規表現でURL等の最後のスラッシュまでを取得
var urlSrc = 'http://example.com/hoge/fuga/index.html'; var urlPth = urlSrc.match(/.+\//); // ← http://example.com/hoge/fuga/
ラベル:
javascript,
URL,
正規表現
2017/10/19
Let's Encrypt + さくらレンタルサーバー OSブラウザ別 .htaccess
Let's Encrypt にさくらのレンタルサーバーが対応したので、リダイレクト用 .htaccess を書いたメモ
非対応のブラウザ等はリダイレクトしないという感じの記述です
本来はガラケーとかも考慮すべきかもしれませんが、下記ではしてません
Let's Encrypt 総合ポータル と userAgent一覧 を参考に、iOS, Android, Internet Explorer の旧バージョンをザックリと対象外に
改行を LF で記述
非対応のブラウザ等はリダイレクトしないという感じの記述です
本来はガラケーとかも考慮すべきかもしれませんが、下記ではしてません
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 で無効化した後、設定変更を行う
Applet を turned off で無効化した後、設定変更を行う
ラベル:
Google Assistant,
Google Home,
IFTTT
2017/10/16
IFTTTで Maker (Maker Channel)が見つからない
IFTTTで Maker (Maker Channel) を検索しても表示されない → Webhooks を使え
(配置などは同じなので、Maker Channel を例にしたサイトを参考に利用できます)
https://ifttt.com/maker のリンクも https://ifttt.com/maker_webhooks へ飛ばされます
(配置などは同じなので、Maker Channel を例にしたサイトを参考に利用できます)
https://ifttt.com/maker のリンクも https://ifttt.com/maker_webhooks へ飛ばされます
ラベル:
Google Assistant,
Google Home,
IFTTT,
IrKit
2017/10/13
Google Home の設定に必要なアプリが動作する Android および iOS バージョン
Google Home (mini含む) の設定に必要なアプリケーションが動作する Android および iOS バージョン が見つけられにくかったのでメモ
PCではいずれも設定不可、せめてChromeブラウザ拡張でできるようになれば便利だけど、初期の Wi-Fi 接続設定が困難ですな
-->
【参考】
Google Home および Google Home Mini を使用するための OS の最小要件
PCではいずれも設定不可、せめてChromeブラウザ拡張でできるようになれば便利だけど、初期の Wi-Fi 接続設定が困難ですな
-->
OS | バージョン |
Android | 4.4 以降 |
iOS | 9.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の場合を捕捉
大まかな流れ等
PHP の場合、こちらの 形式で応答(Action の sayHello が該当の箇所)
また、送られてくる json は、DialogFlowの右側にある「try it now」からコマンドを入力して、一番下の show json で確認できるので、ファイルに保存して
上の
$update_response = file_get_contents("php://input");
【注意】
ここで使用する独自コマンドは、Google Home から独自コマンドが搭載された自作アプリへ接続して、会話を行うような利用方法です。ok,google に続いて一発ものの命令を行う場合 IFTTT を利用するほうが容易です
基本的な流れはこちらを参考にさせていただきました
上記は例が python + Flask なので既存のサーバへ受け渡すのとはちょっと違ったのでPHPの場合を捕捉
大まかな流れ等
- DialogFlow のアカウントを有効にするGoogleサインアップがフツーかもGoogle傘下なので
- Agentを作成(この中に intent を複数作成していく)
- Intentを作成(音声命令 = intent な感じです)
解説に有る Fulfillment のチェックボックスが見つからないのは、Fulfillment が定義されていないからです。Fulfillmentを定義すると出現します - Entities は音声命令を節毎に分離して汎用性を高められます
「テレビの電源 入れて」の各節を TV とか パワーとか オンして みたいなゆらぎを入れてクロスでマッチしてくれたりします(後で intent に組み込めるのでテストでは飛ばしてもOK) - Fulfillment で呼び出す URLを指定
ここのURLは Agentと対になり Intent の Action が送られてきますので、URLが違えば Agent も違うという事になる
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で貼り付けてれば確認可能です
動作の流れ
2017/10/06
Android 8.0 (Oreo) 前後ショートカット作成方法の違い - Android Studio
Android 8 (O) API26 からショートカットの作成方法が変わったのでメモ
ダイナミックショートカットは、アプリアイコンをうにゅっと押し続けて4つくらいまで表示されるショートカットの事です(iPhoneでいう3D Touch のクイックアクション)
requestPinShortcut の第2引き数はショートカット作成後のイベントらしいです、エミュレータでは requestPinShortcut 処理後にOSからショートカット作成確認のダイアログが出てましたので、作成が完了したかどうかなんかが受け取れるのかも(未確認)
また、(操作の話ですが)ダイナミックショートカットを長押しして、フツーのショートカットとしてコピーする事が出来ます
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("ショートカット名"));
また、(操作の話ですが)ダイナミックショートカットを長押しして、フツーのショートカットとしてコピーする事が出来ます
ラベル:
Android 8,
Android O,
Android Studio,
API26,
ショートカット,
ダイナミックショートカット
2017/10/05
Amazon Prime 会員向けに読み放題サービス開始
読み放題サービス Prime Reading 開始
家族会員のアカウントにもメールが到着しているが、家族会員が利用できるかは不明(Video等も利用できないので、おそらく不可)
まぁ、Videoとか有るくらいだから、読み物もあって当然かも
家族会員のアカウントにもメールが到着しているが、家族会員が利用できるかは不明(Video等も利用できないので、おそらく不可)
まぁ、Videoとか有るくらいだから、読み物もあって当然かも
WebView の Basic認証 NG時にリトライさせたい - Android Studio
WebView の Basic認証をダイアログ表示させるものの、入力情報が間違っていてもリトライしてくれない
認証エラーは onReceivedHttpError イベントの errorResponse.getStatusCode() == 401 を拾うことで捕捉可能ですが、ページを初めて開いた時も同じ401のイベントが発生するので注意が必要です
下記では authRun をダイアログ入力直後とするフラグを設けて onPageFinished や onReceivedError で解除を行っていますが、もっとスマートな方法は無いものだろうか...
【追記】
上記コードは Android 6.0 (API 23) 以降用でで、それ以前は 同名のイベントが存在するものの...
これが全く使えないイベントで 401時に呼ばれるはするものの errorCode に -1 が入っていたりして判断できるものが全くありません
Basic認証しているということで onReceivedHttpAuthRequest を利用していると思いますが
handler.useHttpAuthUsernamePassword() || authRun とかでとりあえず逃げておいたけど、バージョンで分けるのが正しい方法だと思います
ちなみに、onReceivedHttpAuthRequest には別の落とし穴もあるようで、
ユーザーとパスワードをURL埋め込んで、かつ認証情報が間違っていた場合、このイベント内でいくら正しい認証情報を入れ直したとしても、URLの埋め込みを利用されて全く認証が完了しなかったりします
なので、load時に埋め込み認証情報を分離して、このイベントで投入し直すという方法を取りました
認証エラーは 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時に埋め込み認証情報を分離して、このイベントで投入し直すという方法を取りました
ラベル:
Android Studio,
Basic Auth,
WebView,
ベーシック認証,
リトライ
2017/10/04
ClosedXML.dll の入手
ClosedXML.dll の入手について友人から聞かれたのでメモ
GitHubのソースからコンパイル手順
- ClosedXMLは旧公式サイトから GitHubへ移動
- バイナリDLLがダウンロードできるのは、旧サイトのDownloadsページ の右の方
(ここでは、0.75.0までのバイナリがダウンロードできるらしい) - 上記より新しいバイナリは、GitHubのソースからコンパイルしなさい
GitHubのソースからコンパイル手順
- ClosexXML(GitHub) 右の Clone or download から zip ファイルをダウンロードして解凍
- Zipファイル内の ClosedXML.sln を Visual Studio (今回は 無料の 2015 Community)で開く
- ソリューションをビルド(注意・デフォルトで他のプロジェクトが選択されている場合がある)
- ClosedXML-develop\ClosedXML\bin\Debug や ClosedXML-develop\ClosedXML\bin\Release に ClosedXML.dll や DocumentFormat.OpenXml.dll が生成される
FastMember.Signed.dll は何でしょう??
ラベル:
ClosedXML OpenXML,
Excel,
Visual Studio
2017/10/03
Button のイベントを発生させる - Android Studio
ボタンのタップイベントを呼び出す
((Button)findViewById(R.id.myButton)).callOnClick();
ラベル:
Android Studio,
Button,
Call,
Click Event
Android ProgressBar の setAlpha は 0~1
Android で ProgressBar の setAlpha 設定を行ったメモ
setAlpha の引き数 0~255 のパーツが多いみたいですが
ProgressBar の setAlpha は 0(透明)~1(透過なし) の float 指定
progressBar.setApha(0.5f) とかです
setAlpha の引き数 0~255 のパーツが多いみたいですが
ProgressBar の setAlpha は 0(透明)~1(透過なし) の float 指定
progressBar.setApha(0.5f) とかです
ラベル:
Android Studio,
ProgressBar,
setAlpha,
透過
2017/10/02
Android ProgressBar のクルクルが環境によって表示されない
Android の ProgressBar のクルクル(砂時計というのも古いのか)が実行環境によって表示されない
開発者向けオプションの「Animator再生時間」がオフになっていると、そのものが表示されません
また、クルクルの速度はここの設定が反映されますが、あまり遅い 2x等にすると、ホーム画面のフォルダがモッサリしたりします
開発者向けオプションの「Animator再生時間」がオフになっていると、そのものが表示されません
また、クルクルの速度はここの設定が反映されますが、あまり遅い 2x等にすると、ホーム画面のフォルダがモッサリしたりします
ラベル:
Android Studio,
ProgressBar
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">
AdView mAdView = (AdView) findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);
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 等に下記の広告ロードを追加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>
AdView mAdView = (AdView) findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);
そんな感じでした
2017/09/30
Galaxy S7 Edge がフリーズして起動不可能に
Galaxy S7 Edge (SC-02H SCV33) が VR使用中にフリーズして、電源ボタン長押しでも再起動しない
ボリュームUP + ボリュームDown + 電源 を長押で再起動
ボリュームUP + ボリュームDown + 電源 を長押で再起動
2017/09/28
Fragment に置いた WebView が真っ白のまま
Android で Fragment に置いた WebView がロードしても真っ白なまま
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_browser, container, false); webView = (WebView)view.findViewById(R.id.webView1); // : return inflater.inflate(R.layout.fragment_browser, container, false); }原因は inflater.inflate を2回呼び出していた
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_browser, container, false); webView = (WebView)view.findViewById(R.id.webView1); // : return view; }
2017/09/26
「ヨドバシ・ドット・コム」配送遅延て日本郵便が原因?
ヨドバシ・ドット・コムで、2017年9月20日(水)頃から出荷作業に遅れが生じているとか
ちょうど 21日(木)の夜に注文していたので、その履歴
ちょうど 21日(木)の夜に注文していたので、その履歴
21日(木)21時頃に注文した商品は、6時間後の22日(木)3:00には引受してる
注文時から、到着予定日が 26日(火)と記載されていたので、おかしいと思っていたら、何故か荷物には「着日指定」が行われており、最寄りの郵便で3日も保管という始末
これって、ヨドバシの注文を日本郵便がさばききれないので、配達日を分散させて均等化を図ったって事じゃないのでしょうか
私の所に到着する Amazonの荷物も半分くらい日本郵便になっているし、忙しさが移動しているのかもね
ガンバレ ヨドバシ×日本郵便
2017/09/21
iCloudメールで受信拒否
iCloudメールから転送元が拒否され
The original message was received at Thu, 21 Sep 2017 08:00:00 +0900 (JST)
from **********.ne.jp [***.***.***.***]
----- The following addresses had permanent fatal errors -----
<*******@icloud.com>
(reason: 550 5.7.0 Blocked - see https://support.proofpoint.com/dnsbl-lookup.cgi?ip=***.***.***.***)
The original message was received at Thu, 21 Sep 2017 08:00:00 +0900 (JST)
from **********.ne.jp [***.***.***.***]
----- The following addresses had permanent fatal errors -----
<*******@icloud.com>
(reason: 550 5.7.0 Blocked - see https://support.proofpoint.com/dnsbl-lookup.cgi?ip=***.***.***.***)
なメールが返された
https://support.proofpoint.com/dnsbl-lookup.cgi?ip=***.***.***.*** のURLから解除申請しろという事なワケだが、それじゃ「迷惑メール」フォルダは何のためにあるんだろうかと
そもそも iCloudメールはフィルタが貧弱でspam非判定が利用できないとか、片手間な感じが強い
https://support.proofpoint.com/dnsbl-lookup.cgi?ip=***.***.***.*** のURLから解除申請しろという事なワケだが、それじゃ「迷惑メール」フォルダは何のためにあるんだろうかと
そもそも iCloudメールはフィルタが貧弱でspam非判定が利用できないとか、片手間な感じが強い
2017/09/17
Gear VR がインストールできない
Galaxy S7 Edge でもらった Gear VR を久々に出してきて Oculus アプリを起動したら、Gear VRアプリをインストールしろとの指示、しかしインストール画面に進んでも「サーバに接続中」の後、一瞬インストールが表示されるが元の画面に戻ってしまう
Oculusアプリの自動更新設定をオンにして、端末を再起動・しばらく放置するとアップデートが完了して利用可能になる
アップデート通知もオフにしていたので、数回のアップデートをスキップしていたためだろう
2017/09/15
NTTは加入電話を2本以上申し込むと違う局番を持ってくる
ひかり電話を推し進めるようになってから NTTは、加入電話(メタル系のアナログやISDN)を2本以上申し込むと、違う市内局番を持ってくる
※03-xxxx-yyyy の xxxx の所
市内局番が違う電話番号は、
これらの問題を回避できる事から「ひかり電話」のセールスへと繋がるワケです
ちなみに、回線申込時に同じ局番にして欲しいといえば、同じ局番の番号をくれるくらいの事はしてくれますので、将来どちらへ転んでもいいように、同じ局番で揃えておくことをオススメします。
あと、ひかり電話で追加番号を頼むと、ひかり電話専用の市内局番が割り振られます。この番号は今のところ、加入回線や他社のサービスへ番号ポータビリティできませんので、注意が必要です。
この場合、予算と時間があれば、加入回線を新規で引いて、すぐにひかり電話の追加番号へ移行するという方法で、何処へでもポータビリティ可能な番号で運用することが可能です。
※03-xxxx-yyyy の xxxx の所
市内局番が違う電話番号は、
- ISDNのiナンバーに組み込めない
- 加入電話(アナログ、INS64, INS1500)のダイヤルインに組めない
これらの問題を回避できる事から「ひかり電話」のセールスへと繋がるワケです
ちなみに、回線申込時に同じ局番にして欲しいといえば、同じ局番の番号をくれるくらいの事はしてくれますので、将来どちらへ転んでもいいように、同じ局番で揃えておくことをオススメします。
あと、ひかり電話で追加番号を頼むと、ひかり電話専用の市内局番が割り振られます。この番号は今のところ、加入回線や他社のサービスへ番号ポータビリティできませんので、注意が必要です。
この場合、予算と時間があれば、加入回線を新規で引いて、すぐにひかり電話の追加番号へ移行するという方法で、何処へでもポータビリティ可能な番号で運用することが可能です。
Android VPN の通知をロック画面から消す
Android で VPN接続の通知を、ロック画面から消す
設定→通知→詳細設定→全てのアプリ(システムアプリを表示)で
「Androidシステム」の通知設定を変更
他の通知に影響が有るかと思ったが、今のところ問題なし
設定→通知→詳細設定→全てのアプリ(システムアプリを表示)で
「Androidシステム」の通知設定を変更
他の通知に影響が有るかと思ったが、今のところ問題なし
Time4vps の障害情報ページ
リトアニアの VPS サービス Time4vps の障害情報ページ
(サーバが再起動されていたので、調べたら Kernel upgrade と記載されていた)
https://billing.time4vps.eu/status/
カレンダーの赤い所がソレです
(サーバが再起動されていたので、調べたら Kernel upgrade と記載されていた)
https://billing.time4vps.eu/status/
カレンダーの赤い所がソレです
2017/09/12
「support.Microsoft.com は言う」偽マイクロソフトのページでブラウザがフリーズ
重いjavascriptを処理させて、ブラウザクラッシュを誘うページ
「**お使いのコンピュータは、BLOCKEでした。」
【閲覧注意・javascriptをオフにして閲覧】
http://www.support.microsoft9063yjpmschs7577.com.s3-website-ap-northeast-1.amazonaws.com/
ブラウザがメモリを使いまくって停止したようになるだけなので、特に問題はありません
support.microsoft をサブドメインに含むサイトはブロックすべきかもね
まぁ、上記を放置している amazonaws.com やリンク元の www.cpm20.com を hosts ファイルに登録しておいてもいいです
「**お使いのコンピュータは、BLOCKEでした。」
【閲覧注意・javascriptをオフにして閲覧】
http://www.support.microsoft9063yjpmschs7577.com.s3-website-ap-northeast-1.amazonaws.com/
ブラウザがメモリを使いまくって停止したようになるだけなので、特に問題はありません
support.microsoft をサブドメインに含むサイトはブロックすべきかもね
まぁ、上記を放置している amazonaws.com やリンク元の www.cpm20.com を hosts ファイルに登録しておいてもいいです
Windows10 のスタートでアプリが検索できなくなった時の対処
Windows10 のスタートメニューで、アプリケーションが検索できなくなることがしばしば
ストアアプリ以外を検索させる方法は、コチラ
今回は、全てのアプリケーションが検索できなくなった場合(インデックス破損とかそういうの)
OS再起動とかかったるいので、タスクマネージャーを起動(ctrl+shift+esc)して、詳細から SearchUI.exe を選択→タスクの終了で、強制終了 → しばらくすると SearchUI.exe は自動で起動する
これで、スタートをからアプリケーションを検索してみる
ストアアプリ以外を検索させる方法は、コチラ
今回は、全てのアプリケーションが検索できなくなった場合(インデックス破損とかそういうの)
OS再起動とかかったるいので、タスクマネージャーを起動(ctrl+shift+esc)して、詳細から SearchUI.exe を選択→タスクの終了で、強制終了 → しばらくすると SearchUI.exe は自動で起動する
これで、スタートをからアプリケーションを検索してみる
2017/09/11
モバイルdポイントカードかざすだけだが、音にセンスが無いドコモ
dポイントカードをおサイフケータイへ入れおけば、ローソン等でかざすだけでdポイントが付与される「モバイルdポイントカード」
iD決済をスマートフォンで行う場合、dポイント付与とiD決済を連続して行えるわけだが、モバイルdポイントの音が「プヒ」みたいな音で、とても恥ずい
ここにも、ドコモのセンスの無さが漂ってきます
iD決済をスマートフォンで行う場合、dポイント付与とiD決済を連続して行えるわけだが、モバイルdポイントの音が「プヒ」みたいな音で、とても恥ずい
ここにも、ドコモのセンスの無さが漂ってきます
デスクトップOSの Google Drive アプリ終了で「バックアップと同期」への移行が簡単だった
デスクトップOS の Google Drive アプリが終了予定で、バックアップと同期(Backup and Sync) へ移行しろとの事
コレ、Google Drive が終了するんじゃなくて、バックアップと同期に Google Drive への同期機能が含まれてるから、そっちを使えという意味で、サービスそのものや Android や iOS の Driveアプリは継続
今回移行する「バックアップと同期」は、Drive同期とフォトアップロード等、Google ストレージへの接続アプリの統合版という事になる
Google Drive からの移行は、Google Drive を削除せずにバックアップと同期をダウンロードしてインストールするだけ
Google Drive を削除せずに上記をインストールすれば、接続情報なども引き継がれるので、再認証も不要です
コレ、Google Drive が終了するんじゃなくて、バックアップと同期に Google Drive への同期機能が含まれてるから、そっちを使えという意味で、サービスそのものや Android や iOS の Driveアプリは継続
今回移行する「バックアップと同期」は、Drive同期とフォトアップロード等、Google ストレージへの接続アプリの統合版という事になる
Google Drive からの移行は、Google Drive を削除せずにバックアップと同期をダウンロードしてインストールするだけ
Google Drive を削除せずに上記をインストールすれば、接続情報なども引き継がれるので、再認証も不要です
2017/09/08
Nova Launcher のフォルダ + サイレントモードPRO でカメラ無音が解除されてしまう
サイレントモードPRO を有効にした端末で、Nova Launcher のフォルダに置いてあるアイコンを開くと、数秒でカメラの消音状態が解除されてしまう
フォルダスワイプ(Nova Launcher Prime 機能)では症状が出ないので、フォルダアイコンが閉じる等の状態変化にサイレントモードPROが反応している様子
アイコンやショートカットをフォルダから出すか、フォルダ先頭においてスワイプ起動することで消音状態を継続させられる
フォルダスワイプ(Nova Launcher Prime 機能)では症状が出ないので、フォルダアイコンが閉じる等の状態変化にサイレントモードPROが反応している様子
アイコンやショートカットをフォルダから出すか、フォルダ先頭においてスワイプ起動することで消音状態を継続させられる
2017/09/04
北朝鮮ミサイル発射のお知らせでやるべきこと
北朝鮮のミサイルが発射されてから、北海道の東沖に着水するまでの時間が14分なので
何をやっても無駄ですな
迎撃による破片を避けるために、屋内に居るというくらいだろうか
どこかへ避難するにも、着弾位置が確定できないなら移動しても無駄だし
冷蔵庫の好きなものを急いで食べるとかか
人生最後の食事になるかもしれないので
何をやっても無駄ですな
迎撃による破片を避けるために、屋内に居るというくらいだろうか
どこかへ避難するにも、着弾位置が確定できないなら移動しても無駄だし
冷蔵庫の好きなものを急いで食べるとかか
人生最後の食事になるかもしれないので
Google Chrome プルダウンメニューのショートカット
Google Chrome 設定関連メニューをプルダウンさせるショートカット
Chrome のキーボード ショートカットには、ホットキーだからか載っていないのか
Alt + F でプルダウンメニューが開く
Chrome のキーボード ショートカットには、ホットキーだからか載っていないのか
Alt + F でプルダウンメニューが開く
2017/09/01
懐かし Windowsの カット・コピー・ペースト
オレが Windowsを使い始めた頃、Ctrl+Insertがコピーで、Shift+Insert が貼り付け、Shift+Delete が切り取りだった
わかるかなぁ~ わかんねーだろーなぁ~
わかるかなぁ~ わかんねーだろーなぁ~
昔と今のショートカット
動作 | 昔 | 今 |
切り取り | Shift+Delete | Ctrl+X |
コピー | Ctrl+Insert | Ctrl+C |
貼り付け | Shift+Insert | Ctrl+V |
※今でも使えます
cuenote.jp 使うなら spf くらい設定したらどうよ
cuenote.jp 経由でお知らせを送ってくるサービスが多数ある
(基本的にどうでもいいお知らせメールなので、うちではspamスコアが上がるように設定しているわけだが)
しかし、spfも設定せずに cuenote.jp 経由でお知らせを送ってくるような銀行があったりするわけで・・・
一斉送信するサービスないか?→ cuenoteてのがあr → それで送ろう
みたいな、テキトーな社内の動きがあるんだろうよ
(基本的に
しかし、spfも設定せずに cuenote.jp 経由でお知らせを送ってくるような銀行があったりするわけで・・・
一斉送信するサービスないか?→ cuenoteてのがあr → それで送ろう
みたいな、テキトーな社内の動きがあるんだろうよ
2017/08/31
急ぎの仕事で pgAdmin4 が糞すぎて気絶するかと思った
接続先が Oracle から PostgreSQL に変更となったので、ソース変更という急ぎ(6時間くらい)の仕事を受け取ったのだが、PostgreSQL が入っていなかったので、インストールして付属の pgAdmin4 を使って、疑似テーブルを作成しようとしたが、あまりの糞加減に気絶しそうだった
インストール後、pgAdmin4 を起動してテーブルを作成しようとしたが Schemas の中身にDBが表示されるとか意味不明~、再起動で通常の表示に
んで、テーブルを作成してテキトーなカラムを作って、View/Edit Data からデータを入れようとしたが、データが入りません・・・・・・
この View/Edit Data でテーブルを編集するには、そのテーブルに プライマリキーが存在しないと編集できないんだそうな
画面内からユーザーパスワード変更したら、そっから先何も出来ないとか、ずいぶんと足を引っ張ってくれました
インストール後、pgAdmin4 を起動してテーブルを作成しようとしたが Schemas の中身にDBが表示されるとか意味不明~、再起動で通常の表示に
んで、テーブルを作成してテキトーなカラムを作って、View/Edit Data からデータを入れようとしたが、データが入りません・・・・・・
この View/Edit Data でテーブルを編集するには、そのテーブルに プライマリキーが存在しないと編集できないんだそうな
画面内からユーザーパスワード変更したら、そっから先何も出来ないとか、ずいぶんと足を引っ張ってくれました
2017/08/29
Djangoのバージョン選択
Python のフレームワーク Django を利用した際のバージョン選択のメモ
まずは、Pythonで 2.7を利用するか 3系統を利用するかを決定
Django はどちらもサポートしているわけですが、ここの対Python対応バージョンを見てみる
3系統なら Django2.0移行でもいいんじゃね。とか思ってしまうわけですが、こちらに Django バージョンごとのサーポート期間てのがあり
LTSとついているのが、ロングサポートになります
つまり、Django 1.11が Python2.7系でも3系(3.7移行でなければ)でも、現状で最も長くサポートされるという事になります
プロジェクトが 2019年以降に稼働するなど、ターゲットを Django 2.2 とした場合 2.0や2.1を選択する必要があるかもしれません
まずは、Pythonで 2.7を利用するか 3系統を利用するかを決定
Django はどちらもサポートしているわけですが、ここの対Python対応バージョンを見てみる
3系統なら Django2.0移行でもいいんじゃね。とか思ってしまうわけですが、こちらに Django バージョンごとのサーポート期間てのがあり
LTSとついているのが、ロングサポートになります
つまり、Django 1.11が Python2.7系でも3系(3.7移行でなければ)でも、現状で最も長くサポートされるという事になります
プロジェクトが 2019年以降に稼働するなど、ターゲットを Django 2.2 とした場合 2.0や2.1を選択する必要があるかもしれません
2017/08/24
ひかり電話→ISDN への番号通知
ひかり電話から、ナンバー・ディスプレイ契約なしの NTT ISDN(INS64, INS1500)回線へ着信させた場合、番号が通知されます
一般的に通知される発呼側の回線
2016年12月末の総務省データをまとめると、加入電話の割合は 9%を切っており
ISDN回線でナンバー・ディスプレイ契約を行う意味が微妙になってきています
2016年12月末 電話回線加入者数
一般的に通知される発呼側の回線
- ISDN回線
- ひかり電話
- 050 IP電話
- 携帯電話
- PHS
2016年12月末の総務省データをまとめると、加入電話の割合は 9%を切っており
ISDN回線でナンバー・ディスプレイ契約を行う意味が微妙になってきています
2016年12月末 電話回線加入者数
種別 | 加入数(万加入) | 割合 |
加入電話 | 2,028 | 8.89% |
ISDN | 318 | 1.39% |
IP(0ABJ) | 3,206 | 14.05% |
IP(050) | 834 | 3.66% |
携帯電話 | 16,068 | 70.45% |
PHS | 356 | 1.56% |
合計 | 22,810 | 100.00% |
登録:
投稿 (Atom)