2018年3月22日木曜日

Lumin SDK mabu コマンドで json.decoder.JSONDecodeError: Invalid \escape: line 12 column 37 (char 570) が発生する

Magic Leap が Lumin SDK を公開したとのことでさっそく遊んでいますが、躓いたことがあったので記録しておきます。
ちなみに、 Windows10 x64 環境でやっています。

json.decoder.JSONDecodeError: Invalid \escape: line 12 column 37 (char 570) が発生

コンパイルと実行を試しているところで、こんなエラーがでました。
json.decoder.JSONDecodeError: Invalid \escape: line 12 column 37 (char 570)

なんか json で怒られているのだけど、さっぱりわからず。
そもそも json なんて作ってないし、同ディレクトリに sample.json はあるけれどまず関係ないだろって内容でした。

vswhere.exe が日本語を返している

幸いにも stack trace が出ているので追ってみると、どうやら Visual Studio の環境設定を vswhere.exe から json で取得しており、その項目 description に日本語文字列が入っています。エラーメッセージ(line 12 column 37)から見ても、"個々" の "々" の位置らへんを指しているので、コイツが悪さしていると考えて間違いなさそうでした。

vswhere.exe 実行結果、description 部分

全体

良くわからない時は思い切る

なんか encoding が不正なんだな、と思い調べてみましたが、python ではエンコード問題が多発するようで、関連記事が見つかりまくりました(笑
ただ python を書いたことがないので結局正解がよくわからず、思い切って description の項目を削除するように変更してみました。

msvc.py (638行目の locate 関数)
    @staticmethod
    def locate():
        if HOSTOS == OS_WIN:
            vswhere_file_path = os.path.join(
                os.environ["ProgramFiles(x86)"],
                "Microsoft Visual Studio",
                "Installer",
                "vswhere.exe"
            )

            if os.access(vswhere_file_path, os.F_OK):
                cmd = [
                    vswhere_file_path,
                    "-requires", "Microsoft.VisualStudio.Component.VC.Tools.x86.x64",
                    "-format", "json",
                ]

                out = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

                if out and out.returncode == 0:
                    json_string = out.stdout.decode("utf-8", "replace") if out.stdout else "[]"

                    # 日本語文字列が入ってくるので、思い切って description を削除
                    import re
                    json_string = re.sub(r'"description".+,', "", json_string)

                    json_data = json.loads(json_string)

こんな感じに。

そうすると、エラーが解消され実行することができました。

めでたし。




2018年3月19日月曜日

PHPUnit を Composer でインストールする。それだけ。

PHPUnit を初めてインストールしました。
あまりにも当たり前すぎて、ググった記事にはない内容もあるので記録しておきます。

前提

  • Windows 環境です(Unix/Mac 環境でもほぼ同じですが)

PHPUnit を Composer でインストール

インストール方法はいくつかありますが、composer を使います。

以下の composer.json を準備して、
{
    "require-dev": {
        "phpunit/phpunit": "7.0.*"
    }
}

インストール。
composer install

実行ファイルが以下の場所に出来ます(※これを探しました笑)
project_root/vendor/bin/phpunit.bat

project_root/vendor/bin/ に PATH を通して
(画像は RapidEE を使ってます)


Version 確認コマンドが働いたらインストール確認まで完了。
phpunit.bat --verion

Version 確認コマンドの実行結果。オッケー。
PS C:\Git\60_GitLab\sample_project> phpunit.bat --version
PHPUnit 5.0.10 by Sebastian Bergmann and contributors.

以上。

参考

https://phpunit.readthedocs.io/ja/latest/installation.html

2018年3月18日日曜日

Selenium + Chrome の環境が一瞬で構築できたというアレ。

前提

さて Selenium を試してみようか!
と思った時点で、こんな環境でした。
  • Windows10 64bit
  • Chrome はもちろんインストール済
  • php もインストール済
    • そしてパスが通っている
  • composer もインストール済
    • そしてパスが通っている

ブラウザのオートメーションと言えば昔は…

余談ですが、昔やったときは VB かなんかで IE を CreateObject して、なんか色々頑張ってやる感じで、まぁブラウザの操作自動化しても良いけどクソ面倒くさいよ。むしろ AutoHotKey とかでキー操作を自動化したほうが早いわ。ぐらいに思っていましたが…、時代は大分前進していたようで。

Selenium で Chrome を自在に動かす。しかも一瞬で。

さて、早速準備ですがやることはこれだけです。
  1. PHP 用ドライバを DL
  2. Windows 用 Chrome ドライバを DL

PHP 用ドライバを DL

composer.json にこう書いてインストールするだけです。
{
    "require": {
        "facebook/webdriver": "1.5.*"

    }
}
※最新版の Version は GitHub で確認してください

インストール。どん。
composer install
以上。

Windows 用 Chrome ドライバを DL

ここから「chromedriver_win32.zip」をダウンロードして解凍するだけです。
64bit 専用はないので、64bit でも 32bit 版で動かします。
linux と mac 版も置いてありありますね。
※最新版の Version はこちらで確認してください

Selenium の Hello world

ここまでできたら、あとはソースがあれば動きます。
試しに Google で Hello world を検索して見ます。

ソースはこんな感じ。

hello_world.php
<?php
require_once './vendor/autoload.php';

use Facebook\WebDriver\Chrome\ChromeDriver;
use Facebook\WebDriver\WebDriverExpectedCondition;
use Facebook\WebDriver\WebDriverBy;

function hello_world()
{
    // 環境変数にドライバパスを設定
    putenv('webdriver.chrome.driver=' . __DIR__ . '\chromedriver.exe');
    
    // Chrome を起動してページ遷移する
    $driver = ChromeDriver::start();
    $driver->get("https://www.google.co.jp/?q=helloworld");
    // 【検索】ボタンを押下
    $elem = $driver->findElement(WebDriverBy::name('btnK'));
    $elem->click();

    sleep(3);
    $driver->close();
}

hello_world();

※ facebook webdriver の API 一覧はこちら

最終的なフォルダ構成は、こうなっています。

あとはコレを実行すると、、
php hello_world.php

ブラウザが立ち上がり…

https://www.google.co.jp/?q=helloworld に遷移して【Google 検索】をクリックし…

検索結果のページが表示され…

3秒待機したら終了します。

はい、ここまで一瞬ですね。素晴らしい。
正直、こんなに簡単だとは思っていませんでした。

これで、ローカルでの自動化環境は整いました。
あとは API などを見ながら味付けしていく感じかと思います。
今回は、目的がローカル環境で達成できたので、 Selenium Server を使用していません。

次は、Selenium Server と組み合わせてみたいと思います。

以上。

補足

今回は facebook 製のを使いましたが、PHP の Web driver は公式では 3つ紹介されています。

参考

2018年3月17日土曜日

DNS 設定の反映確認ツール

DNS が反映されない…

先日、細かいサーバなどを整理している際、もうサービス提供していないので閉鎖させたサイトがあったのですが、また復活させたら DNS は使いたい。ということで DNS だけ別のサーバに向けて生かしておくことにしました。

何度か設定を試みたのですが何故か反映されず。。
どうにか今の DNS 設定を外側から確認できないかと思って調べたところ、ずばりそんなツールがありました。

whatsmydns

whatsmydns というサイトです。
指定した DNS の情報がどれだけ反映されているか、こんな感じで確認できます。

"A", "CNAME", "TXT" などタイプ毎に確認することができます。

"A" を指定したところ。

"CNAME" を指定したところ。

反映されていなかったら、X になります。

便利ですね。

digwebinterface

whatsmydns は〇×なのがちょっと、、、もっと詳しく情報を見たい!
という場合向けに、digwebinterface というサイトもありました。

玄人感のある見た目ですが、同じように使えます。

はっきり値が分かるので、これはこれで納得感があって良いですね。

もしやと思って Dig で調べたところ、Dig コマンドというのがありました。
その名の通り Dig の Web interface なのでしょう。
Windows でいうところの nslookup 的なものでしょうか。

問題の原因は…

色々と調べた結果、原因はレコードの設定が "無効" になっているという落ちでした。
眠い時にやるもんじゃないようで。

参考

https://docs.microsoft.com/ja-jp/azure/app-service/app-service-web-tutorial-custom-domain

2018年3月15日木曜日

Visual Studio Code が 超便利な CSV Viewer に。

仕事で CSV データを調査する機会があったので、なんとなく CSV Viewer を調べてみたら「Excel Viewer」というめちゃくちゃ便利な Visual Studio Code の拡張があったというお話しです。

要はこれなんですが…

さっそく、サンプルとして郵便局サイトにある東京の住所一覧で見てみます。
普通に開くとこうなるのは通常通りで、、

ここで Open Preview すると…

サクッとこうなります。

拡大するとこう。生の CSV よりは段違いに見やすいですね。

まずそれだけでも十分なのですが、
なんと、Sort や Filter もサクサク動きます。CSV であることを忘れるぐらいに。

もう、Excel に CSV 食わせて、「前0が消えてる」とか「日付が数値になった」とか「いったん全部文字列にしてー」とかやらなくて良さそうです。素晴らしい。

一応 これ、CSV 以外に Excel も開けますが、Excel は Excel で見たほうが良いねって感じの微妙な動きでした。あと、Powered by Wijmo とのことで、中身は FlexGrid と FlexSheet が動いているっぽいです。GrapeCity、懐かしい響きです。

それでは。

2018年3月10日土曜日

PHP のシステムから SendGrid を使ってみました。

メール送信機能を追加する機会があったのですが、サーバに何も設定されておらず、Dev や Staging など複数台のサーバに作業するのは面倒だなぁと。。
じゃぁ SendGrid を使って見ようということでやってみたら、驚くべき楽さで出来たという話です。。
  1. API KEY を取得する
  2. composer で library を install
  3. サンプルのママでメールが届く
正味30分もかかららず終わりました。。
サーバをアレアレ弄ってるとあっという間に1時間くらいたつので、ダンチです。
API 経由であれば、送信に失敗したときのエラーもしっかり返してくれるので、mail() や mb_send_mail() よりも優しい。。

API KEY を取得する

早速やった内容ですが、
API KEY は SendGrid の管理画面で取得します。
KEY 毎に細かく権限を設定できるようです。
【Create & View】を押下すると Key が表示されます。

こんな感じ。
1回きりしか表示されません。【Done】を押下するとその後は「*****」とマスクされた状態でしか見れません。忘れたら削除するのみ。

composer で library を install

GitHub repository の README にあるように、composer が使えるので composer.json に以下の記述をして、composer install するだけ。
{
  "require": {
    "sendgrid/sendgrid": "~6.0"
  }
}
https://github.com/sendgrid/sendgrid-php

サンプルのママでメールが届く

これも同 README にあるように書いて、API KEY と to のメアドだけ書き換えれるだけ。
// If you are using Composer (recommended)
require 'vendor/autoload.php';

// If you are not using Composer
// require("path/to/sendgrid-php/sendgrid-php.php");

$from = new SendGrid\Email("Example User", "test@example.com");
$subject = "Sending with SendGrid is Fun";
$to = new SendGrid\Email("Example User", "test@example.com");
$content = new SendGrid\Content("text/plain", "and easy to do anywhere, even with PHP");
$mail = new SendGrid\Mail($from, $subject, $to, $content);

$apiKey = getenv('SENDGRID_API_KEY');
$sg = new \SendGrid($apiKey);

$response = $sg->client->mail()->send()->post($mail);
echo $response->statusCode();
print_r($response->headers());
echo $response->body();
https://github.com/sendgrid/sendgrid-php

これだけで(躓きもなく)動きました。素敵ですね。
料金体系もやたら優しいので、わざわざメールの設定するぐらいならこっちのがいいやと感じました。
回し者ではありませんよ(笑
それでは。

2018年2月28日水曜日

MariaDB + DBeaver で、日付の扱いに不安があるという話

まず前提として、DBeaver はお気に入りです。
無料で使える質の良い SQL Client ですが、完璧はものは存在しないわけで、、

それは TIME 型 から始まった

MariaDB には TIME 型というデータ型があります。

Description

A time. The range is '-838:59:59.999999' to '838:59:59.999999'Microsecond precision can be from 0-6; if not specified 0 is used. Microseconds have been available since MariaDB 5.3.
https://mariadb.com/kb/en/library/time/
この通り、ちょっとした範囲の時間(時刻でなく) を格納できる型です。
"25:45:00" とか "-40:00:00" という、「時刻」のフォーマットとしては許可されない値まで入るという。

ある時、DBeaver がこんな表示をしていました。

ところが、SQL を close_time = "02:00:00" としても取得することができません。
書きこんではどうかと、close_time に書き込んでも、思った通りの値が入りませんでした…

もしやと思い command でデータを取得してみると、、

あらどうして、DBeaver が表示する値と異なっているではありませんか。
そう、これは「時刻として正しくない時間を表示できない」という DBeaver のバグだったのです。やれやれ。。

NULL が抽出できない

そんなことを忘れた頃に、今度は「NULL の日付が取得できない」という問題が発生しました。

DBeaver での表示はこうで、2番目のデータが取得できていませんでした。

さすがに今度はそこまで悩む前に、MySQL Workbench で確認してみました。
すると。。。

なんということでしょう。
今度は「0000-00-00」を NULL と表示してしまうバグにぶち当たったのでした。。。

この日が DBeaver に初めて Issue 登録した日になりました。
DBeaver はマイナーな DB にも All-in-one で対応しているので、細かい方言に対応しきれていないようです。

ただ、UI も機能もスピードも優秀なので、もちろんこれからも使っていきます。
お世話になってるので、PR を送るぐらいしても良いかなと思いました。
MySQL Workbench から完全卒業できる日はまだのようです。