思いがけないエラー原因

メルアドというのはある個人の IDとしても使用できます 中にはもちろん自分個人のメルアドを作らず、一つのメルアドを共有されている方々もおられますが、この場合どんなプライベートな連絡もその人々で共有されてしまいますので、プライバシーを保つことができません

そんなメルアドの特性からメルアドは IDとして良く使用されます そして、その人が登録されているか否かの判定にはデータベースをメルアドで検索し、見つかった個数が 0であれば登録されていない、という事実を利用します つまりプログラムに書けば以下のようになります

$stmt = $pdo->prepare( "SELECT COUNT(*) FROM `doctor_tbls` WHERE `email` = :email;" );  // (A)
$stmt->bindValue( ":email", $test-email-address, PDO::PARAM_STR );   // $test-email-addressをテストするためにpdoで変数をバインドする
$flag = $stmt->execute();  
// 検索を実行する
if ( !$flag ) {        
// エラーが無いかチェックする
  $infor = $stmt->errorInfo();
  print_r( $infor );
  exit;
}
$already_registered = $stmt->fetchColumn(); 
// COUNT(*)によりそのメルアドがDBに存在するか調べる 既に登録済のメルアドであれば、0ではない
if ( intval($already_registered) === 0 ) { 
// ここからメルアドが登録されているか否かのチェックとなる
}


if ( $already_registered === 0 ) { 
// こうするとこのブロックの中に入らない
}


if ( $already_registered == 0 ) { 
// こうするとこのブロックの中にきちんと入る
}

PHPには同一性判定として ==と ===の2つがあります ===は値のみならずその型もチェックします ですから、===の方が論理的に合っていますので、通常は ===を使用すべきです しかしながらこのように DBより読み込んできたりすると見かけは数字の0であったとしても型が異なるのです ですから、きちんと作動するようにするためには intva()関数により整数型に変換せねばならないのです これに気づくのに相当の時間がかかりました

Excelデータを二次元配列に読み込む

今 成田空港に向かう NEXの中でテストを走らせています もちろん Objectとして Excelの行や列を扱うのも良いのですが、MySQL側はあくまでも二次元配列という概念ですので、今後のために2次元配列に変換します その部分を作成しました

require '../vendor/autoload.php';

use PhpOffice\ PhpSpreadsheet\ Spreadsheet;
use PhpOffice\ PhpSpreadsheet\ Writer\ Xlsx as Writer;
use PhpOffice\ PhpSpreadsheet\ Reader\ Xlsx as Reader;
use PhpOffice\ PhpSpreadsheet\ Cell\ Coordinate;

$reader = new Reader();
//$reader->setInputEncoding('SJIS');
$spreadsheet = $reader->load( 'poster2018.xlsx' );
//$reader->setInputEncoding('SJIS');
$sheet = $spreadsheet->getActiveSheet();

$lines = array();
$max_row = 0;	// 今rowの最大数値
$max_column = 0;	// 	columnの最大値
$nlines = array(); // Columnを数字にした二次元配列

$row_counter = 0;
$column_counter = 0;
foreach($sheet->getRowIterator() as $row) {
  foreach($sheet->getColumnIterator() as $column) {
    $lines[$row_counter][$column_counter] = $sheet->getCell( $column->getColumnIndex() . $row->getRowIndex() )->getValue();
    // これで$linesという2次元配列に Excel dataが集積された
    // これからは $lines[n][m]のような二次元配列として扱うことが可能となる
    $column_counter++;
  }
  $row_counter++;
}
$max_row = $row_counter;
$max_column = $column_counter;

ここでキモとなるのが、Excelではそれぞれのセル座長は A1より始まる表記となっていることです 通常の二次元配列では[0][0]より始まる配列ですので、この変換が必要となります

また Excelファイルを扱う時何時も問題となるのが、文字コードです Excelでは DOSからの伝統で日本語文字コードは Shift-JISであり、現在のプログラミングで標準的な UTF-8とは合いませんし、文字化けが起こります

そこで、PhpSpreadSheetにも

$reader->setInputEncoding('SJIS');

というメソッドが定義されているのですが、最近の Excelで改善されたのか、何しろそのようなメソッドを使用せずに自動的に UTF-8に変換されるようです ですからこのメソッドは不要でした

この10日間 悩み抜いたバグがようやく解決

さて、https://www.kamakuralive.net/ のWeb programを作る段階で、コメコメ部門のポスター発表部分がまだ実装できていませんでした その理由は唯一つ、僕がズルというか楽をしたいからだったのです

既にポスター演題が 20集まっており、それをコメコメ委員の方々が Excel形式で集計してくださっていました しかし、それを Web databaseである MySQLデータベースに読み込まねばなりません 実は既に昨年、 Excel (これはShift-J文字コード) の xlsx形式-> Text形式 (.txt)に変換 -> 文字コードを UTF-8に変換 -> .txtを MySQL databaseに読み込み という部分は作成していました

まあ作成といっても、foreachでループを回して読み込むだけなのですが・・・

今回は折角ですので、自分の勉強のためにもPHPSpreadSheetという Excelファイルを PHPで読み込むライブラリを用いることにしたのです

その部分は案外簡単に Excel file読み込みに成功したのですが、肝腎の MySQL databaseに書き込む SQL文がエラーが出るのです その部分のバグとりが全くうまくいかず 10日間以上を無駄に過ごしてしまいました いや 決して人生において無駄というのは無いでしょう そう思わねばやってらんないよっ

結局その部分を簡略化して出しましょう

try {
  // MySQLサーバへ接続
  $pdo = new PDO( "mysql:host=$db_host;dbname=$db_name_sessions;charset=utf8", $db_user, $db_password );
  // 注意: 不要なspaceを挿入すると' $db_host'のようにみなされ、エラーとなる
} catch ( PDOException $e ) {
  die( $e->getMessage() );
}

for ( $rowNo = 1; $rowNo < 24; $rowNo++ ) {
  $stmt = $pdo->prepare( "SELECT COUNT(*) FROM `doctor_tbls` WHERE `email` = :email;" );
  $stmt->bindValue( ":email", $nnlines[ $rowNo ][ 12 ], PDO::PARAM_STR );
  $stmt->execute();
  $count_same_email = $stmt->fetchColumn();

  if ( $count_same_email < 1 ) { // 既にこのメルアドは登録されているのでスキップ
     $stmt_dr = $pdo->prepare( "INSERT INTO `doctor_tbls` (`english_sirname`, `english_firstname`, `is_male`, `email`, `changed`) VALUES (:enlish_sirname, :enlish_firstname, :is_male, :email, :changed);" ); 
    $stmt_dr->bindValue( ":english_sirname", $nnlines[ $rowNo ][ 1 ], PDO::PARAM_STR );
    $stmt_dr->bindValue( ":english_firstname", $nnlines[ $rowNo ][ 2 ], PDO::PARAM_STR );
    
    if ( $nnlines[ $rowNo ][ 3 ] === 'M' ) {
      $sex = 1;
    } else {
      $sex = 0;
    }
    
    $stmt_dr->bindValue( ":is_male", $sex, PDO::PARAM_INT );
    $stmt_dr->bindValue( ":email", $nnlines[ $rowNo ][ 12 ], PDO::PARAM_STR );
    $stmt_dr->bindValue(":changed", date('Y-m-d H:i:s'), PDO::PARAM_STR);
    
    $flag = $stmt_dr->execute();
    
    if ( !$flag ) {
      echo "<h2 style='color:red;'>Error</h2>";
      $infor = $stmt_dr->errorInfo();
      print_r($infor);
      exit( $infor[ 2 ] );
    }
    
  }
}

これがエラーで書き込めません、色々と試みたのがうまく行きませんので、最後に  print_r($infor)の一行を加えて、SQLエラー出力を行いました

そうすると MySQL error code

SQLSTATE[HY093]

というのが出てくるのです これは検索すると パラメータの数が合わないなのですが、目を更にして見てみてもそんな訳はありません しかし、この 10日間の苦難の末ようやく発見しました

 

VALUES (:enlish_sirname, :enlish_firstname, :is_male, :email, :changed)

この部分で english_ とすべきを enlishとしているのですね このためパラメータの数が合わないため SQL errorとなっていたのです なんだかなあ パカみたい 10日間損した気分 でも自分が招いたものだから仕方ありません

本日はこれから 成田空港に向かいます このエラーを解決したのでポスター・セッション部分のプログラム完成できますね

cssを用いて formを横並びで表示するには?

<form></form>は基本的に縦にしか並びません 何というのでしょうか ブロック要素と呼ぶのでしょうか

これを cssを用いて横並びに表示するのはどうすれば良いか、色々と検索したところここにヒットしました ありがたいことです それで早速用いました こんな感じです

<div style="display:inline-flex;">
  <form method="post" action="action1.php" class="form-inline text-left" style="margin-right: 0.3em;">
    <button type="submit" class="btn btn-sm" name="session" value="<?= $row['id'] ?>">Chair追加</button>
    <input type="hidden" name="role_kind" value="1"/>
    <input type="hidden" name="sessionNo" value="<?= _Q($row['sessionNo']); ?>"/>
  </form>
  <form method="post" action="action2.php" class="form-inline text-left">
    <button type="submit" class="btn btn-sm" name="session" value="<?= $row['id'] ?>">Chair追加 (Role数)</button>
    <input type="hidden" name="role_kind" value="1"/>
    <input type="hidden" name="sessionNo" value="<?= _Q($row['sessionNo']); ?>"/>
  </form>
</div>

これによりこんなふうに表示されて、2つのボタンが並びます

formを横並び表示する

HorliXの最新情報

今朝深夜に情報入手しました HorliXにおいて不具合がありましたが、すぐに解決法が公開されました それは JPEGtoDICOMというプラグインです 読んで時の如しで JPEGファイルを DICOMファイルに変換するプラグインでしょう 「でしょう」というのは無責任ですが、自分では使用したことが無いのです すみません

その解決法は HorliX作者の Airさんのブログで公開されています 簡単ですね

今日は数ヶ月ぶりの日曜日

いやあ久しぶりにゆっくりと休んでいます 本当に何ヶ月間も休みが無かったのです そんな中今日は朝からゆっくりと日曜日です 「日曜日には何をするか?」ですか、決まっています ネットで本日休店でないことを確認して、自宅近くの「ブックスペース栄和堂」にいるのです

残念ながらこの店は 10月25日をもって閉店するそうです なんでも大家さんが建て替えを決定したとのことです まあそうは言いましても目の前には広大な JR大船工場跡地が広がり、そこは未だ原っぱのままです 数年内に鎌倉市役所などの公共施設と何処かの大学が移転してきて、近くには JRの新駅もできるという噂です そうなれば、この地域は鎌倉で一番地価も上昇する土地となるでしょう そんな予測もあって立ち退きになるのかも知れません そらには目の前のボーリング場も先日の台風に被害を受け、台風の後は営業を中断しているとのことでした ここも立ち退きになるのかも知れませんね 時代はどんどん変わっていきますね

そうそうそして今日はその栄和堂で 12:30より籠もっているのです 例によってプログラミングをしながら本(Kindle)を呼んだり僕の大好きな「まったりとした」時間を過ごしています 今読みかじっている本はこれです

はじめてのLISP関数型プログラミング

LISPというコンピューター言語はほとんど FORTRANに次ぐ古くから開発された言語です しかし、その独特の表現 – カッコの羅列 のためになかなか素人には馴染みがないもので、僕にとっても例外ではありませんでした

しかし、LISPは古くから純粋関数を用いた関数型プログラミングを提唱し、その流れをいくつかの言語、特に現代の Web開発では必須の言語である Javascriptにもその系譜がつながっているのです

関数型ブログラミングの中で特徴的なのは Closureやらラムダ計算 (λ計算)、あるいは無名関数というもの、そして方法論としての monadoとかいう言葉です これらを知っているか知らないでいるか、そこには多分 ずっと日本国内にとどまっているか あるいは外国を渡り歩いているか それぐらいの違いがあるのです

もっともこの本の中のある一文を引用すると「しかしラムダ計算を知っていることで見栄を張ることはもちろん、関数型プログラミングの本質に迫れます。」ということも事実なのです 少なくとも僕は見栄を張りたいですねっ

HorliX解説 – より正確な内容に

HorliXのアイコン – カッコいいね

さあ Macユーザーの皆様方 、HorliXを既に AppleStoreで購入されましたか? 未だの方 あるいは購入の仕方が分からない方は、僕が以前 upしたブログ記事をご覧下さい

以前も紹介しましたように、HorliXは OsiriXの OSS (Open Source Software)から分離した(Falkした) Horosという DICOM Softwareがあるのですが、そこからさらに Falkしたものです

Falkしたと言ってもその作業は Air様一人で 2018/05月頃より開始され、二ヶ月ぐらいで公開できるレベルにまで持っていかれ、そしてあの厳しい適合基準をクリアしないと掲載されない AppleStoreの審査を見事パスされ公開された非常に安全で信頼度の高い DICOM Softwareなのです

ここからは Air様と直接お会いして伺った情報も含んでいます

Apple Computerは今年の夏前に MacOSでの 2D/3D描画にこれまで用いてきた OpenGLという画像描画のための共通ルーチン、これはOSSとして開発されているものですが、その採用を突然やめ、Appleが自ら開発した Metalという Framewarkにすると宣言したのです これによりこれまで OpenGLを用いていたソフトの全てが将来的に使えなくなるのです

Appleはその技術レベルの高さ、皆からの信頼、内容の優秀さ、速度の素晴らしさなどから世界に冠たるものとなっており、Appleが宣言すれば皆右に習うをせねばならないのです

このため現在 Macのソフトを開発しているメーカーは大騒ぎとなっています 何故 Appleはこのような高圧的宣言をしたのでしょうか? それは主要な部分を隠蔽化することにより、高度なセキュリティを確保したいからだと思います でも正直大変なのです

そして、さらに Appleが推し進めているのが、ユーザーが試用するアプリも、全て SandBoxという一定の閉ざされた領域に閉じ込め、悪い動作をしないようにする戦略です また、ソフトの全てを 64 bits化することでした これにより色々なビットに Appleでしか分からない意味付けをできるようになるでしょう このような根本的な大掛かりな対策により Appleは高度なセキュリティを確保しようとしているのでしょう

何れにしてもこれらの要件を満たさなければ AppleStoreの審査に通らなくなったのです これらの大きな障害にも関わらず Air様は HorliXを見事 Apple審査に合格させたのです すごいですねえ

何で HorliXが完全に日本語化できないのか? という質問もありますね これの真相は、実は Appleが作成し、公開しているソフトウェア開発のための IDE (Integrated Developping Environment; 統合開発環境)である、Xcodeに内在するバグが原因らしいのです 所詮欧米メーカーは unicodeへの対応に消極的であり、結果として日本語を完全に入れ込むと HorliXが落ちてしまうらしいのです この問題は既に皆が認識しており、また HorliXだけで見られるものではないらしいのです まあ皆さん方 暫く待ちましょう

Air様はこれからも Plug-inなどの形式を用いて機能を充実して行かれる方針です ただし、その機能が本当に使われるものである、という前提が必要です 皆様方も本当にその機能が必要で、かつ皆が使うであろうものであれば、HorliXを良くしていくためにどんどん意見をアップして下さいね

いるかの棲む闇

本日は前から楽しみにしていた あの HorliX開発者の Air様と 7:30AMより病院でお会いしました この才能豊かな天才的 Software (+ Hardware) Engineerとは以前、僕のブログに掲載していた DICOM Viewerの C++で書いた Windows用プログラムを見つけられ、それで継がりができたのです

前からお会いしたいと思っていたのですが、なかなか僕も時間がとれずついに本日となりました

実際のAir様とお会いしました!! (わざと顔はぼかしてあります)

お会いして色々なお話をしました 技術的レベルは彼がエベレストの頂点近くにいるとすれば、僕はようやく鎌倉の六国見山頂上ぐらいにいるレベルでしょう それほどに知識、経験、頭脳、根性、反骨心 それら皆が数段上なのです 何しろ僕は自分のことを「壮年は過ぎたアマチュア・プログラマ」と謳っているぐらいですから・・・

まずはご出身について伺いました 何と彼は新潟県のご出身でその後、筑波大学理工学部物理学科を出られたそうです この時点で既に物理学、特に電磁力学などの素養と、プログラミングの素養、そしてハードウェアを操る素養を身につけられたようです そして卒業後は技術系会社に就職され、そこで実地での開発仕事を行われ、そこでも高度なプログラミング能力を否が応でも披露することになったようです そしてその頃より当時日本国政府が音頭を取り、某国立大学の当時教授が旗印となり鳴り物入りで立ち上げた「日本国統一電子カルテ構想」にも関わるようになったようです そう あの「開いたイルカ」プロジェクトです 僕が勝手に描いている物語かもですね

そうそうご存知無い方も、「開いたイルカ」を英語に置き換えたものを検索すればこれが何かはすぐに分かるかと思います このイルカさんが棲んでおられる場所は相当に闇かもですよっ

僕自身のことを言わせて頂けば、電子カルテについても以前より興味があり、そこの基本的データ表現には MML (Medical Markup Language)という XML (eXtensive Markup Language)と本質的に同一のものすごく冗長なデータ記述言語が用いられ、それが故にどの電子カルテもデータに関しては互換性を保てる、そのようなことは知っていました そして、何と東京の産婦人科の開業医の方が御自分一人で Java言語を用いて電子カルテシステムを構築し、それを皆に公開していることも知っていました そこに持ち上がったのが「開いたイルカ」プロジェクトです でも僕から見ればこのプロジェクト最大の問題はその中心となっておられた錦の御旗の先生ご自身があまりプログラミングに詳しくなく、実際には一行のコードも書けないのではないでしょうか? その結果起こったことは、錦を担ぎ上げ、それで商売するソフトウェアの方々が増えてきたのです その中には北海道の某技術工業系大学の先生方もおられました その方々はもちろんコードをご自身でかける方々でしたが、やはり中心の先生がグイグイと技術的に引っ張れないとこのようなプロジェクトはどうなるのでしょうかねえ

結果的にこの「開いたイルカ」プロジェクトは今は落日でしょうか その一方で例えば湘南鎌倉総合病院の属する徳洲会では既に全国統一大規模電子カルテシステムが稼働し、そこから big dataも収集できるのです この電子カルテは「開いたイルカ」プロジェクトとは関係ありません 徳洲会がこのような状況ですから、「開いたイルカ」のシェアはどんどん低下し、結果的に開発力もどんどん低下し、やれることは政治的な圧力を加えることのみでした

そして何と Air様はそのような圧力の真っ只中に放り込まれ、一時は「Air死亡」という噂を流して自分の身を守らねばならない程に追い込まれたということです 恐ろしいですねえ 国家権力をバックにえばるのはやめて欲しいですねえ

そうそうそのようなことも影響してでしょうか、Air様は何とその後 某大学医学部の入学試験を受験され、見事通過し、その後6年間 その大学で医学生として学び、医師国家試験にも合格し、その後、某診療科で有名な某公立病院で某診療科医師として研修され、さらにいくつかの国家資格を取得されました 現在でもその診療科医師として活動されています

何で僕自身が自らの言葉でこのようなことを言えるのでしょうか? 実は先にも言いましたように電子カルテシステムについては以前より興味がありました そのため、わざわざ京都にも出かけ、その方面の会合にも参加し、勉強してきました そして、ある時 呼びかけがあり、手を挙げた人のみが某国立大学別邸に集まり、電子カルテの会合を持ったのです そこには錦さんや、その他の 何でしょうか取り巻きでしょうかねえ そのような方々が 10名ぐらい集まられ、特に参加に関して制限が無く、事前に申し込んであれば参加できたので参加した僕なんかは、ものすごい疎外感を感じました そして、「あー これは決して開いた ものではない、ガチガチに外を排除するものだ」と感じたのです この時の僕の感覚はとても鋭かったですねえ 今から 5年前の 2013年のことでした

さて Air様はその一方でエンジニアとして活動も再開され、HorliXの開発に入ったのです

ものすごいですねえ 壮絶な人生でカッコいいですねえ ちなみに年齢は僕より 18歳若いです 羨ましいな

ヘルシンキから神戸 そして WSL

WSLという言葉をご存知でしょうか Windows Subsystem for Linuxのことです

Microsoftは数年前より急速に Open Softwareに舵を切り替え、その代表として WSLという仕組みを開始したのです これは Windows10というこれまで Microsoftを支えてきた OSの中に Linuxという Open Softwareの OSをシームレスに走らせる仕組みです

もちろんこれまでに Windows10の上では、VirtualBoxや、VMWareといった有名な仮想マシン、あるいは Dockerなどのコンテナと呼ばれる仮想マシンの小型版がフリーで走っていました しかし、VirtualBoxや VMWareは Windows10の中に新たにコンピューターシステムを立ち上げるもので、マシンに対する負荷が大きいものでした

これに対して WSLというのは Windows10 OSの上に Linuxの APIを emurateする型で Linux OSを立ち上げるものです ここいら辺に関しては僕も知識がいい加減であり間違ったことも言っていると思いますので、それぞれが調べて下さい 何れにしても WSLを立ち上げたのです

その方法はネットで検索すると色々出てきますが、僕の場合、このサイトに従いました 少なくとも 2018/SEP/13の最新 Windows10 version 1803においてはこれで正しくインストールできます

とは言うもののこのサイトの後ろ半分に書かれている内容はかなり高度なものであり難解です とりあえず僕はここまで つまり、<Hyper の設定 for WSL>という部分まで行い結果的にこのような画面となりました

Linux (Ubuntu) on Windows10
Linux (Ubuntu) on Windows10 on MacOS

さて昨日は成田空港から羽田空港に移動し、伊丹空港に飛び、それから神戸の高橋病院に入りました そこで三例のPCIを行わせて頂きました

楽しく過ごしました

こんなの見つけました

Appleのファイル構造に興味を持つようになりました きっかけは HorliX Dataというフォルダを探していて、それが一般に分からない場所に設定されていることを見つけたことにあります

そして、サンドボックス (SandBox)という一般から隠蔽され、自由にアクセスできない領域について知りました やはりこれも Appleがプログラマ向けに公開している文書なのですが、内容難しいですねえ でも、何処かで見た xml文書構造の例を発見しました

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
   <key>Move</key>
   <array>
      <string>${Library}/AppSandboxQuickStart/MyConfiguration.plist</string>
      <array>
         <string>${Library}/AppSandboxQuickStart/MyDataStore.xml</string>
         <string>${ApplicationSupport}/AppSandboxQuickStart/MyDataStore.xml</string>
      </array>
   </array>
   <key>MigrateScriptsForApplication</key>
   <string>AppSandboxQuickStart</string>
</dict>
</plist>

あれっ、この構造 何処かで見ましたよね そうです albumファイルの構造です あひゃーっですね