2017/12/26

Gmail で さくらのレンタルサーバーから SSL で POP3 受信

Gmail から さくらレンタルサーバー のメールを SSL で POP3 で受信するメモ

POPサーバ:  さくらの初期ドメインでドメインを記載 ←重要
ポート番号:  995
メールの取得にセキュリティで保護された~ にチェックを入れる




2017/12/18

楽天が通信キャリア事業に進出

楽天が通信キャリア事業に進出

新規で進出するくらいなら、イー・アクセスの買収(ソフトバンクが総額 3600億円)でもうちょっと頑張っておけばよかったものの、いつもの出遅れが楽天らしい所です

すっかりソフトバンクも横並びになり、マンネリ化した通信業界に新規参入は利用者にとってプラスになることは間違いないでしょう

個人的には、Amazonとの差を埋めるために運送業でもやったほうが良かったのではと思いますが...

2017/11/29

PHP の PDO で debugDumpParams の出力をファイルなどに保存

SQL の実行結果を確認しようにも bindValue や bindParam を使っていると、実行内容を取得できない
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; }

通常は 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() を使用したのと同じ }


2017/11/27

PHP の call_user_func_array + bind_param で参照渡し

call_user_func_array で mysqli の bind_param を呼び出しをまとめつつ、汎用性をもたせたい

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が書き換えられない限り、データの変動は起こりません

2017/11/21

Nintendo Switch を Amazon から3時間くらいで購入したメモ

Nintendo Switch を転売屋の餌食にならず Amazon から3時間くらいで購入したメモ
ただし、サンタさんの手柄

転売屋対策なのか Amazonでは switch 本体のみよりも、ポーチやダウンロード版との組み合わせの方が、入荷が多いような気がします
ポーチやマリオオデッセイ等、いずれ購入する予定があれば、それらの抱合せ商品を狙うと、より容易に購入できると思われます
ちなみに、switch本体に30GB程度のメモリ空き領域があるので、いくつかのダウンロード版を利用するのであれば SDカードは無くても利用可能です

下準備
  1. スマホに Twitter アプリを入れて、通知の設定をする
  2. Twitter の switch販売速報bot 等をフォローして、モバイル通知をオンにする
  3. Amazonで switchの商品構成と価格をチェック
  4. Amazon で 1-Click注文 を有効にする

購入編
  1. 購入したい商品のページを開いておく(候補が複数あればそれらも)
  2. スマホの Twitter アプリでプッシュ通知がくる
    【重要】ここで、商品が何かをTwitter画面で確認するのは時間の無駄です
  3. 購入したい商品のページをリロード、金額とAmazonが販売していることを確認
  4. 1-Click注文 → NG or 注文完了
  5. あとは、2~4 を繰り返す

本体の商品構成
  • 本体のみ
  • 本体 + ポーチ等
  • 本体 + ソフト


2017/11/16

Firefox 57 Quantum アップデート開始

新Firefox Quantum 登場



  • 旧形式のアドオンは利用不能(代替えを探す機能あり)
  • メモリ使用量は、そんなに減ってない(と思う)
  • 進む・戻る がもたつく
  • スクリーンショット機能を標準で搭載
  • Firefox Sync は継続利用可能
  • Shockwave Flash はプラグインに残っている

先日、久々にOpera(blink)を試してみましたが、昔のサクサク感がまったくなくて非常に残念だったので、Quantumには頑張って欲しいところです
レンダリング速度と体感速度は違うって事を Operaは知っていたはずだけど...

2017/11/14

Python ディクショナリの keys や values の順序

Python のディクショナリを keys() や values() で独立して読み取った場合、取得される順序が同じかどうか

「python keys values same order」というキーワードで質問が散見され、各バージョン(2系, 3系)共にその間ディクショナリに手が加えられなければ、オーダーが保持されるだそうです

SQL の INSERT 文なんかに便利に使えたりする
ちなみに、配列をカンマ区切りの文字列で返すには下記のようにすると簡単です

s = ', '.join(data.keys())

2017/11/13

Python コメント coding:utf-8 の記述位置

Python + apache で UTF8の情報を扱っていたら SyntaxError: Non-ASCII character のエラーが多発、どうも

# -*- coding: utf-8 -*-

の記述位置が悪かったようで
途中に記述していたコメントを移動させて

#!~/python
# -*- coding: utf-8 -*-

pythonのパスが先頭、次の行にcodingを記述したら動作するようになった
マジックコメントって必要な場所より上にあればいいと思っていた・・・

Python + MySql で execute paramでテーブル名は渡せない

Python + MySql で execute paramでテーブル名は渡せないそうです

cur.execute("DELETE FROM %s WHERE (%s = %s);", ("myTable", "myKey", 10)) # NG cur.execute("DELETE FROM %s WHERE (%s = %s);" % ("myTable", "myKey", 10)) # OK


Firefox アドオンの Stylish がついにアップデートされて Chromeと同じ仕様に

Firefox アドオンの Stylish がついにアップデートされて Chromeと同じ仕様になった
閲覧サイトの送信問題とかいろいろあるわけですが

少し前から、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 # -*- 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系
#!~\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 を入れる
cur = conn.cursor(dictionary=True)
が、カラムの並びが???→宿題

Visutl Studio Code で Python だけタブを4スペースにする

Visutl Studio Code のタブ動作をデフォルトのスペースからタブに変更しているが、Pythonは4スペースにしたい
  1. Ctrl + Shift + P → Preferences: Configure language specific settings
  2. Python(下の方)を選択するか入力
  3. 表示される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     } }

UniServer(Uniform Server) Zero で Python を動かす

簡単に Apache + PHP + MySQL の環境が作れる UniServer Zero で Python を動かしたメモ

  1. Pythonをダウンロード + インストール
    必要によって python.exe ディレクトリへパスを通す(cgiとしては通す必要ないです)
    インストールディレクトリ\PythonXX\ やら \PythonXX\Scripts に通しておくと便利です
  2. UniServerZ\core\apache2\conf\httpd.conf を開く
  3. py拡張子でスクリプト動作させる場合 httpd.conf の
    AddHandler cgi-script .cgi

    AddHandler cgi-script .cgi .py
  4. 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 米国発売時期
タイプ米国発売
Echo Dot2015/06/23
Echo (2nd gen)2017/10/31
Echo Plus2017/10/31

ちなみに後発の Google Home は
タイプ米国発売
Google Home2016/11/04
Google Home Mini2017/10/19

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 )


ログイン情報

-->
ホストraspberrypi.local
ユーザーpi
パスワードraspberry

コンフィグ
$ sudo raspi-config

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 を押して、バージョンを更新する

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-

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

そんな感じでした

2017/09/30

Galaxy S7 Edge がフリーズして起動不可能に

Galaxy S7 Edge (SC-02H SCV33) が VR使用中にフリーズして、電源ボタン長押しでも再起動しない

ボリューム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時頃に注文した商品は、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=***.***.***.***)

なメールが返された

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 の所

市内局番が違う電話番号は、

  • ISDNのiナンバーに組み込めない
  • 加入電話(アナログ、INS64, INS1500)のダイヤルインに組めない

これらの問題を回避できる事から「ひかり電話」のセールスへと繋がるワケです

ちなみに、回線申込時に同じ局番にして欲しいといえば、同じ局番の番号をくれるくらいの事はしてくれますので、将来どちらへ転んでもいいように、同じ局番で揃えておくことをオススメします。


あと、ひかり電話で追加番号を頼むと、ひかり電話専用の市内局番が割り振られます。この番号は今のところ、加入回線や他社のサービスへ番号ポータビリティできませんので、注意が必要です。
この場合、予算と時間があれば、加入回線を新規で引いて、すぐにひかり電話の追加番号へ移行するという方法で、何処へでもポータビリティ可能な番号で運用することが可能です。

Android VPN の通知をロック画面から消す

Android で VPN接続の通知を、ロック画面から消す
設定→通知→詳細設定→全てのアプリ(システムアプリを表示)で
「Androidシステム」の通知設定を変更
他の通知に影響が有るかと思ったが、今のところ問題なし

Time4vps の障害情報ページ

リトアニアの VPS サービス Time4vps の障害情報ページ
(サーバが再起動されていたので、調べたら 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 ファイルに登録しておいてもいいです

Windows10 のスタートでアプリが検索できなくなった時の対処

Windows10 のスタートメニューで、アプリケーションが検索できなくなることがしばしば
ストアアプリ以外を検索させる方法は、コチラ

今回は、全てのアプリケーションが検索できなくなった場合(インデックス破損とかそういうの)

OS再起動とかかったるいので、タスクマネージャーを起動(ctrl+shift+esc)して、詳細から SearchUI.exe を選択→タスクの終了で、強制終了 → しばらくすると SearchUI.exe は自動で起動する
これで、スタートをからアプリケーションを検索してみる

2017/09/11

モバイルdポイントカードかざすだけだが、音にセンスが無いドコモ

dポイントカードをおサイフケータイへ入れおけば、ローソン等でかざすだけでdポイントが付与される「モバイル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 を削除せずに上記をインストールすれば、接続情報なども引き継がれるので、再認証も不要です

2017/09/08

Nova Launcher のフォルダ + サイレントモードPRO でカメラ無音が解除されてしまう

サイレントモードPRO を有効にした端末で、Nova Launcher のフォルダに置いてあるアイコンを開くと、数秒でカメラの消音状態が解除されてしまう
フォルダスワイプ(Nova Launcher Prime 機能)では症状が出ないので、フォルダアイコンが閉じる等の状態変化にサイレントモードPROが反応している様子

アイコンやショートカットをフォルダから出すか、フォルダ先頭においてスワイプ起動することで消音状態を継続させられる

2017/09/04

北朝鮮ミサイル発射のお知らせでやるべきこと

北朝鮮のミサイルが発射されてから、北海道の東沖に着水するまでの時間が14分なので

何をやっても無駄ですな
迎撃による破片を避けるために、屋内に居るというくらいだろうか

どこかへ避難するにも、着弾位置が確定できないなら移動しても無駄だし

冷蔵庫の好きなものを急いで食べるとかか
人生最後の食事になるかもしれないので

Google Chrome プルダウンメニューのショートカット

Google Chrome 設定関連メニューをプルダウンさせるショートカット
Chrome のキーボード ショートカットには、ホットキーだからか載っていないのか

Alt + F でプルダウンメニューが開く

2017/09/01

懐かし Windowsの カット・コピー・ペースト

オレが Windowsを使い始めた頃、Ctrl+Insertがコピーで、Shift+Insert が貼り付け、Shift+Delete が切り取りだった
わかるかなぁ~ わかんねーだろーなぁ~

昔と今のショートカット
動作
切り取りShift+DeleteCtrl+X
コピーCtrl+InsertCtrl+C
貼り付けShift+InsertCtrl+V
※今でも使えます

cuenote.jp 使うなら spf くらい設定したらどうよ

cuenote.jp 経由でお知らせを送ってくるサービスが多数ある
(基本的にどうでもいいお知らせメールなので、うちではspamスコアが上がるように設定しているわけだが)

しかし、spfも設定せずに cuenote.jp 経由でお知らせを送ってくるような銀行があったりするわけで・・・

一斉送信するサービスないか?→ cuenoteてのがあr → それで送ろう

みたいな、テキトーな社内の動きがあるんだろうよ

2017/08/31

急ぎの仕事で pgAdmin4 が糞すぎて気絶するかと思った

接続先が Oracle から PostgreSQL に変更となったので、ソース変更という急ぎ(6時間くらい)の仕事を受け取ったのだが、PostgreSQL が入っていなかったので、インストールして付属の pgAdmin4 を使って、疑似テーブルを作成しようとしたが、あまりの糞加減に気絶しそうだった

インストール後、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を選択する必要があるかもしれません

2017/08/24

ひかり電話→ISDN への番号通知

ひかり電話から、ナンバー・ディスプレイ契約なしの NTT ISDN(INS64, INS1500)回線へ着信させた場合、番号が通知されます

一般的に通知される発呼側の回線
  • ISDN回線
  • ひかり電話
  • 050 IP電話
  • 携帯電話
  • PHS
加入回線(一般的なアナログ電話)以外といった感じです

2016年12月末の総務省データをまとめると、加入電話の割合は 9%を切っており
ISDN回線でナンバー・ディスプレイ契約を行う意味が微妙になってきています

2016年12月末 電話回線加入者数
種別加入数(万加入)割合
加入電話2,0288.89%
ISDN3181.39%
IP(0ABJ)3,20614.05%
IP(050)8343.66%
携帯電話16,06870.45%
PHS3561.56%
合計22,810100.00%