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 から完全卒業できる日はまだのようです。

2018年2月27日火曜日

キーボードで Google 検索する拡張機能を作りました

Google 検索ですが、いつも j k / Enter を超多用して検索しています。
で、このショートカットキーは元々ある機能だったのですが、あるとき無くなりました。

Google 検索から Google+ が外されたタイミング? だったな、、
それと一緒に消え失せました。

なので、自分で作りました。Chrome の拡張機能です。
もし無くなって未だに不便を感じている方はどうぞ。
キーボード使ってなかった、という方は今すぐ使ってください。効率がダンチです。

Google Search with Keyboard






こんな感じで ▶ が表示されます。

以下だけのシンプル機能です。
  • j : 下を選択
  • k : 上を選択
  • / : 入力ボックスへ移動

ブラウザ標準のショートカットと合わせるのが常套手段です。
  • Enter : 選択中のリンクへ遷移
  • Ctrl + Enter : 選択中のリンクを新規タブで開く

Google Search with Keyboard
https://chrome.google.com/webstore/detail/google-search-with-keyboa/ickgeahkgnomlmmmpmhllbfmbncjcnel?hl=ja

どうぞ!

コードはこちら
https://github.com/jtanaka/GoogleSearchWithKB