MySQL 8 CTE を試す

VirtualBox の CentOS7 に入れた MySQL 8 で CTE を試してみました。

あまり参考にはならず、利用効果少ないですが、

[ 利用例 ]

貼ってから気づいたのですが、プラグインの Simple Code Highlighter が対応してなく、with が太字になってないです。


with cnttbl (ld, dc, cnt)
as (
select
	d, dc, count(id) as cnt
from
	sch_export_source
group by
	ld, dc
)

select
	dc,
	pp.CD_CNTRY,
	c.CD_REGION,

	sum(Tomakomai) as Tomakomai,
	sum(Sendai) as Sendai,
	sum(Tokyo) as Tokyo,
	sum(Chiba) as Chiba,
	sum(Yokohama) as Yokohama,
	sum(Shimizu) as Shimizu,

	sum(Niigata) as Niigata,
	sum(Toyama) as Toyama,

	sum(Nagoya) as Nagoya,
	sum(Yokkaichi) as Yokkaichi,
	sum(Osaka) as Osaka,
	sum(Kobe) as Kobe,

	sum(Mizushima) as Mizushima,
	sum(Hiroshima) as Hiroshima,
	sum(Matsuyama) as Matsuyama,

	sum(Moji) as Moji,
	sum(Hakata) as Hakata,

	sum(Kagoshima) as Kagoshima,
	sum(Naha) as Naha

from
	(
	select
		dc,

		case when (ld = 'Tomakomai') then cnt else 0 end as Tomakomai,
		case when (ld = 'Sendai') then cnt else 0 end as Sendai,
		case when (ld = 'Tokyo') then cnt else 0 end as Tokyo,
		case when (ld = 'Chiba') then cnt else 0 end as Chiba,
		case when (ld = 'Yokohama') then cnt else 0 end as Yokohama,
		case when (ld = 'Shimizu') then cnt else 0 end as Shimizu,

		case when (ld = 'Niigata') then cnt else 0 end as Niigata,
		case when (ld = 'Toyama Shinko') then cnt else 0 end as Toyama,

		case when (ld = 'Nagoya') then cnt else 0 end as Nagoya,
		case when (ld = 'Yokkaichi') then cnt else 0 end as Yokkaichi,
		case when (ld = 'Osaka') then cnt else 0 end as Osaka,
		case when (ld = 'Kobe') then cnt else 0 end as Kobe,

		case when (ld = 'Mizushima') then cnt else 0 end as Mizushima,
		case when (ld = 'Hiroshima') then cnt else 0 end as Hiroshima,
		case when (ld = 'Matsuyama') then cnt else 0 end as Matsuyama,

		case when (ld = 'Moji') then cnt else 0 end as Moji,
		case when (ld = 'Hakata') then cnt else 0 end as Hakata,

		case when (ld = 'Kagoshima') then cnt else 0 end as Kagoshima,
		case when (ld = 'Naha') then cnt else 0 end as Naha

	from
		/*  この部分を CTE にしてみる */
		/*(
		select
			ld, dc, count(id) as cnt
		from
			sch_export_source
		group by
			ld, dc
		)a*/
		cnttbl a	
	) b
	left outer join mst_ppcnv pp on (b.dc = pp.NM)
	left outer join mst_cntry c on (pp.CD_CNTRY = c.CD_CNTRY) 
group by
	dc, CD_CNTRY,
	CD_REGION
order by
  CD_CNTRY, dc;
	

PHP GD 画像連結合成

ここで教えて頂きました : http://thr3a.hatenablog.com/entry/20181108/1541682523

[ コード例 ]


<?php

/**
 * GD 画像 連結位置方角指定連結合成
 * argv : 1:ファイル名A, 2:ファイル名B, 3:生成ファイル名, 4:追加位置 (NESW) 
 */

// 引数取得 //
$fnm_a = $argv[1];
$fnm_b = $argv[2];
$fnm_new = $argv[3];
$mrglocation = $argv[4];

// A, B画像サイズ取得 //
list($a_width, $a_height, $type_a) = getimagesize($fnm_a);
list($b_width, $b_height, $type_b) = getimagesize($fnm_b);

//echo $a_width . ":" . $a_height . "\n";
//echo $b_width . ":" . $b_height . "\n";

// 連結位置別新画像サイズ //
$total_width = 0;
$total_height = 0;
switch ($mrglocation) {
  case 'N':
    $total_height = $a_height + $b_height;
    $total_width = $a_width > $b_width ? $a_width : $b_width;
    break;
  case 'E':
    $total_width = $a_width + $b_width;
    $total_height = $a_height > $b_height ? $a_height : $b_height;
    break;
  case 'S':
    $total_height = $a_height + $b_height;
    $total_width = $a_width > $b_width ? $a_width : $b_width;
    break;
  case 'W':
    $total_width = $a_width + $b_width;
    $total_height = $a_height > $b_height ? $a_height : $b_height;
    break;
}
echo $total_width . ":" . $total_height . "\n";

// 連結サイズのキャンバス生成 //
$result_im = imagecreatetruecolor($total_width, $total_height);
// 背景を白にする //
$result_bgcol = ImageColorAllocate($result_im, 255, 255, 255);
imagefilledrectangle($result_im, 0, 0, $total_width, $total_height, $result_bgcol);

// 対象イメージ格納 //
$image_a = imagecreatefromjpeg($fnm_a);
$image_b = imagecreatefromjpeg($fnm_b);


// コピー先の画像,コピー元の画像,コピー先のx座標,コピー先のy座標,コピー元のx座標,コピー元のy座標,コピー元の幅,コピー元の高さ
//imagecopy($result_im, $image_a, 0, 0, 0, 0, $a_width, $a_height);
//
// 連結する //
switch ($mrglocation) {
  case "S":
    imagecopy($result_im, $image_a, 0, 0, 0, 0, $a_width, $a_height);
    imagecopy($result_im, $image_b, 0, $a_height, 0, 0, $b_width, $b_height);
    break;
  case "N":
    imagecopy($result_im, $image_a, 0, $b_height, 0, 0, $a_width, $a_height);
    imagecopy($result_im, $image_b, 0, 0, 0, 0, $b_width, $b_height);
    break;
  case "E":
    imagecopy($result_im, $image_a, 0, 0, 0, 0, $a_width, $a_height);
    imagecopy($result_im, $image_b, $a_width, 0, 0, 0, $b_width, $b_height);
    break;
  case "W":
    imagecopy($result_im, $image_a, $b_width, 0, 0, 0, $a_width, $a_height);
    imagecopy($result_im, $image_b, 0, 0, 0, 0, $b_width, $b_height);
    break;
}

// 新ファイルに出力 //
$filepath = pathinfo($fnm_new);
$ext = mb_strtolower($filepath['extension']);
$res = 1;
try {
  if ($ext === "jpg" || $ext === "jpeg") {
    imagejpeg($result_im, $fnm_new, 100);
  }
  else if ($ext === "png") {
    imagepng($result_im, $fnm_new, 9);
  }
  else if ($ext === "gif") {
    imagegif($result_im, $fnm_new, 100);
  }
}
catch (Exception $ex) {
  $res = 0;
}

// 解放 //
imagedestroy($result_im);

// 連想配列に格納 //
$responce = [];
$responce["Result"] = $res;
$responce["TotalW"] = $total_width;
$responce["TotalH"] = $total_height;

// JSONに変換して結果出力 //
//echo json_encode($responce, JSON_PRETTY_PRINT);
echo json_encode($responce);

?>


[ 利用画像サンプル ]

A画像

B画像

[ 連結結果 ]

大きい方の画像の余白は白にしています。大きい方の画像を先にストレッチしておくと、余白をなくせるかと思います。

S連結

W連結

HeidiSQL を 10.1.0.5464 アップデートして

MySQL でいつも使ってる HeidiSQL の 10.1.0.5464 が新リリースされたようなので、早速インストールしてみたところ、デフォルトで予約語が大文字変換されるようになっていて、(ひょっとして9.5系の設定にもあったのかも知れないが、アップデート時環境設定は引き継がれるので、新たな設定だと思う)
便利な気がしたものの、SQL文の大文字、小文字は、ケースバイケースで使い分けてるので、チェックをはずしました。
詳しくはリリースノートを見たら、書いてある気がしますので、後で見ておきます。

< Ver10.1.0.5464 環境設定 >

PHP GD 枠付文字パネルファイル生成機

[ コード例 ]


<?php

/**
 * GD 文字列パネル描画ファイル生成
 * argv : 1: 生成ファイル名,  2: 横サイズ 3: 縦サイズ 4: フォント色 5:背景色 6:枠色
 *        7: 枠サイズ
 *        8: 書込文字列 9: 文字サイズ 10 : 背景透明度 (0 - 127) (8-10 オプション)
 */

// == 引数取得 == //
$fnm = $argv[1];
$xsz = $argv[2];
$ysz = $argv[3];

// 色指定 //
$rgb_font = $argv[4];
$rgb_fill = $argv[5];
$rgb_frame = $argv[6];
//  isset($argv[10]) ? $argv[10] : "";

// 枠サイズ //
$frlen = $argv[7]; 

// 文字 //
$text = isset($argv[8]) ? $argv[8] : "";
$textsz = isset($argv[9]) ? $argv[9] : "";
$alpha = isset($argv[10]) ? $argv[10] : 0;

// Linux 引数の" が認識されてない対策 //
$text = str_replace("_", " ", $text);

// 引数を16進文字列に分解して配列に入れる //
$fontcols = explode(":", $rgb_font);
$fillcols = explode(":", $rgb_fill);
$framecols = explode(":", $rgb_frame);

// +++ 色文字列を数値に変換 +++ //
// ImageColorAllocate用に10進配列にする //
$fontdecs = [];
foreach ($fontcols as $col) {
  $fontdecs[] = hexdec($col);
}
$filldecs = [];
foreach ($fillcols as $col) {
  $filldecs[] = hexdec($col);
}
$framedecs = [];
foreach ($framecols as $col) {
  $framedecs[] = hexdec($col);
}


// 画像の新規生成 //
$img = imagecreate($xsz, $ysz);

# 色を作る #
// 文字 //
$imcol_font = ImageColorAllocate($img, $fontdecs[0], $fontdecs[1], $fontdecs[2]);
// 背景は透明度指定あり //
$imcol_fill = ImageColorAllocateAlpha($img, $filldecs[0], $filldecs[1], $filldecs[2], $alpha);
// 枠 //
$imcol_frame = ImageColorAllocate($img, $framedecs[0], $framedecs[1], $framedecs[2]);

# UTF8へ変換 #
$text = mb_convert_encoding($text, 'UTF-8', 'auto');

// フォント //
if (DIRECTORY_SEPARATOR == "/") {
  $font = "/usr/share/fonts/vlgothic/VL-Gothic-Regular.ttf";
}
else {
  $font = "C:\Windows\Fonts\msgothic.ttc";
}

// 背景を描画する //
/* img, x1, y1, x2, y2, color */
imagefilledrectangle($img, 0, 0, $xsz, $ysz, $imcol_fill);

// 枠線幅 //
imagesetthickness($img, $frlen);

// 文字を書き込む //
/* img, テキストサイズ, アングル, X, Y, color, font, text */
$textx = (int)($frlen) + (int)($textsz / 2);
$texty = (int)($frlen + $textsz) + (int)($textsz / 2);
ImageTTFText($img, $textsz, 0, $textx, $texty, $imcol_font, $font, $text);

// 枠を引く //
/* img, x1, y1, x2, y2, color */
imagerectangle($img, 0, 0, $xsz, $ysz, $imcol_frame);

// ファイルに出力 //
$filepath = pathinfo($fnm);
$ext = mb_strtolower($filepath['extension']);
$res = 1;
try {
  if ($ext === "jpg" || $ext === "jpeg") {
    imagejpeg($img, $fnm, 100);
  }
  else if ($ext === "png") {
    imagepng($img, $fnm, 9);
  }
  else if ($ext === "gif") {
    imagegif($img, $fnm, 100);
  }
}
catch (Exception $ex) {
  $res = 0;
}

// 解放 //
imagedestroy($img);

// 連想配列に格納 //
$responce = [];
$responce["Result"] = $res;

// JSONに変換して出力 //
//echo json_encode($responce, JSON_PRETTY_PRINT);
echo json_encode($responce);

?>


[ 生成例 ]

      

jQuery-ui Dialog のボタン位置変更と 2個目 のダイアログのハンドリング

jQuery-ui Dialog で、機能豊富なダイアログにしようとして、少しはまったので備忘録しておきます。

デフォルトで下側にあるボタンを上側に配置するのは、セレクタを使って出来ました。

[ コード例 ]


// ボタンメニューを上に置く //
$(".ui-dialog-buttonpane").insertBefore("#alertdialog");

[ 単数ダイアログ画面例 ]

ダイアログ画面から、更にダイアログが現れる場合、

[ 複数ダイアログ画面例 ]

[ 確認ダイアログを閉じた後の状態 ]

閉じたダイアログのボタンが現れてしまいます。

しばらく悩んだ後、わかった原因と解消方法は、jQuery のセレクタの insert で、クラスを指定しているのが原因で、2個目のダイアログのクラスを remove することで解消しました。

[ コード例 ]


/**
 * 汎用確認ダイアログ サイズ指定 Close後ボタンクラス削除
 * @param {type} obj divのid
 * @param {type} title タイトル
 * @param {type} msg htmlメッセージ
 * @param {type} btntxt1 左ボタン
 * @param {type} btntxt2 右ボタン
 * @param {type} func Yesの場合の関数を参照渡し
 * @param {type} w 幅
 * @param {type} h 高さ
 * @returns {undefined} なし
 */
function confirmDialogWithWHRemove(obj, title, msg, btntxt1, btntxt2, func, w, h) {

  var btns = {};
  btns[btntxt1] = function () {
    $(obj).dialog("close");
    func();
    // insert into で上にすると元ダイアログで見えるので //
    $(".ui-dialog-buttonpane").eq(1).remove();
  };
  btns[btntxt2] = function () {
    $(obj).dialog("close");
    // insert into で上にすると元ダイアログで見えるので //
    $(".ui-dialog-buttonpane").eq(1).remove();
  };
  $(obj).html(msg);
  $(obj).dialog({
    title: title,
    modal: false,
    width: w, height: h,
    open: function () {
      // フォーカスボタンのセット //
      $(this).siblings(".ui-dialog-buttonpane").find('button:eq(1)').focus();

    },
    buttons: btns
  });

}

 

Javascript 連想配列の要素数

配列と同じく length でとれて使えると思ったら、undefined になるので、調べたところ、Object.keys() を使えばとれることがわかりました。

ここで教えて頂きました : https://senews.jp/hash-length/

[ コード例 ]


var map = {};
var reccnt = 0;
function setMap(m) {
  map = m;
  // 後で計算で使う場合の為にキャストしておく //
  reccnt = parseInt(Object.keys(photoimoarray).length);
}

PHP GD スケッチ風変換

[ コード例 ]

IMG_FILTER_MEAN_REMOVAL 以外の引数はありません。


<?php

/**
 * GD 画像風景画変換
 * argv : 1 : ソースファイル名, 2 : デストファイル名
 */
 
// 引数取得 //
$srcfnm = $argv[1];
$dstfnm = $argv[2];

// 画像タイプ取得 //
list($src_width, $src_height, $type) = getimagesize($srcfnm);

switch ($type) {
  case IMAGETYPE_JPEG:    // 2
    $im = imagecreatefromjpeg($srcfnm);
    break;
  case IMAGETYPE_PNG:     // 3
    $im = imagecreatefrompng($srcfnm);
    break;
  case IMAGETYPE_GIF:     // 1
    $im = imagecreatefromgif($srcfnm);
    break;
}

// 変換して保存 //
$res = 1;
if ($im) {
  imagefilter($im, IMG_FILTER_MEAN_REMOVAL);
}
else {
  $res = 0;
}

if ($type == IMAGETYPE_JPEG) {
  imagejpeg($im, $dstfnm);
}
else if ($type == IMAGETYPE_PNG) {
  imagepng($im, $dstfnm);
}
else {
  imagegif($im, $dstfnm);
}

// 解放 //
gedestroy($im);

// 連想配列に格納 //
$responce = [];
$responce["Result"] = $res;

// JSONに変換して出力 //
echo json_encode($responce, JSON_PRETTY_PRINT);
?>


ここで教えていただきました。http://kyasper.com/php-tips/

[ 利用例・変換前 ]

[ 利用例・変換後 ]

Java selenium Implicit Wait を使う

selenium でJavaでスクレープする時、読込が終わるまでの待機方法がわからず、Thread.sleep(2000) とかをクリック後の処理に入れてましたが、即完了する場合、不要でタイムアウトして確実に実行できないことも多いので、ちょっと調べたところ、
Implicit Wait を使うと解決するのがわかり、いつも使ってます。

[ コード例 ]



import java.util.concurrent.TimeUnit;    // <== これが必要

    if (this.isHeadless) {
      ChromeOptions options = new ChromeOptions();
      options.addArguments("--headless", "--disable-gpu");
      driver = new ChromeDriver(options);
    }
    else {
      driver = new ChromeDriver();
    }

    // タイムアウトを10秒にセット //
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

ここで教えて頂きました: http://softwaretest.jp/labo/tech/labo-294/

JAVA Runtime の外部プロセス実行で ” で囲んだ文字列が分かれて渡される (Linux)

少しはまったので備忘録しておきます。

[ コード例 ]



String spec = "Width : 23.50 Length : 234.20"
// 外部プログラムコマンド //
String cmd = this.phpGDCommandStamp + " " + imgfnm + " " + outfnm + " "
	      // Windows では通用した //
        //+ "\"" + spec + "\" " +  getPanelColorConfig(spec) + " 48 H " + colrgbMap.get(col) + " "
        // Linux では分かれてしまうので、置き換えて外部プログラム側で元に戻す //
        + spec.replaceAll(" ", "_") + " " + getPanelColorConfig(spec) + " 48 H " + colrgbMap.get(col) + " "
        + this.phpGDCommandPath;
System.out.println(cmd);

String restxt = "";
try {

  Runtime runtime = Runtime.getRuntime();
  Process p = runtime.exec(cmd);
  InputStream is = p.getInputStream();

  // レスポンス取得 //
  int nread;
  byte[] rbuf = new byte[200];
  while ((nread = is.read(rbuf)) > 0) {
  }
  restxt = new String(rbuf, "US-ASCII");

}
catch (Exception e) {
  e.printStackTrace();
}
System.out.println(restxt);