思いがけないエラー原因

メルアドというのはある個人の 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日間損した気分 でも自分が招いたものだから仕方ありません

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

CCTで日本国内初の経皮的僧帽弁接合不全修復システム(MitraClip)ライブデモンストレーション

本日は日本のインターベンションの歴史の中でも格別な日でした それは仙台厚生病院より神戸の CCT会場に経皮的僧帽弁接合不全修復システム(MitraClip)のはじめての日本国内ライブデモンストレーションが中継されたのです 非常に手際よい治療が行われました

このような機会に座長の一人として立ち会えたのはとても光栄であり嬉しく思いました

さて CCTではすっかり自分自身は冠動脈のspaceから遠ざかってしまいました しかしながら治験関係の集まりがいくつかありなかなか開放されません 本日はまた鎌倉ライブデモンストレーション実行委員会が夜に開催されますので遅くなりそうです

今は空いた時間で鎌倉ライブデモンストレーショントップページ兼内容作成のためのプログラムの手直しをしています まだ頑張らなければ

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を横並び表示する

寂しい そして 前に向かって

とてもとても寂しいのです 何故かと言えば、あの行きつけの安らぎの場所「ブックスペース栄和堂」がこの 10月26日より閉店するのです

僕にはこの安らぎのスペースで MacBook Proをひろげて コーヒーとサンドイッチを食べながら Web系のプログラムを書くのが開放された時間だったのです 電源は完備され、また Wi-Fiも飛んでいて しかも雑踏がなく静かに時間を過ごし、色々なことに思いを馳せることができました

最後に先日の日曜日 10/21に訪れました 初めて開店前の 12:00少し前に店に入り、そこから 4.5時間時間を過ごしました 「きっと最後だからたくさんのお客さんで一杯だろう」と思っていたのですが意外にも僕をその 4時間あまりの時間帯には僕を含めて 10名未満のお客さんしかいませんでした

でもお陰様で http://www.kamakuralive.net/ のプログラムはずいぶんと改良され洗練された趣になった(と、勝手に自画自賛している)のです

そして昨日 10月 22日は Chicagoより Tony先生をお招きし、CTO (慢性完全閉塞)に対する経皮的冠動脈インターベンションを合計 4例 + 通常PCI 1例したのです 正直自分の経皮的冠動脈インターベンション体力が以前より絞られてきていますのでCTOを 4例立て続けに治療するのはとても辛いのです

それでも昨日は違いましたねえ 往年の最盛期の僕が戻りましたねえ ワイヤー選択、戦略全てがバッチリでしたし、何より微妙で大胆なテクニックも健在でした

一例が Tonyより proctoringされた ADR (Antegrade Dissection Re-entry; 経順行性乖離腔再疎通)テクニックに関しては正直「邪道」と思っていましたが、実際にやってみるとなかなか面白いし、そのテクニックの中に色々な Tipsがあると感じました

何れにしても新しいことを取り入れようという自分自身の姿勢には我ながら感心しましたよ これが前に向かって ということでした

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

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

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

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

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

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

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

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

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

いるかの棲む闇

本日は前から楽しみにしていた あの 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歳若いです 羨ましいな

久しぶりにTAVIを行いました

本日は朝から札幌東徳洲会病院心臓センターで三件のTAVIがあり、その中の一例を治療させて頂きました

北海道地震の被害からも立ち直りTAVIが本格的に再開されたのです 僕が治療させて頂いたのは、ご高齢の方でしたが、かなり高度な大動脈弁狭窄症であり、治療してよかったと思います 9:30AMよりTAVIのセッションが開始となり、合計で三例の治療を終わったのは 14:00でした 縦に三例を4.5時間半で入れ替えなども含んでする、というのは相当に早いですよね 入れ替え時間を含め、麻酔も含めて一例 1.5時間ということになります 素晴らしいですね

長期間の海外出張で、しかも西に東にですので、相当に体のリズムが狂ってしまいましたが、徐々に回復です とは言っても色々なメールには応答できていません 頭が回りません

頭のリハビリには Javascriptの勉強をしています Javascriptと言っても、正確には ECMAScript20151 というもので、別名 ES6と呼ばれている言語仕様のものです 現在ではほとんどのブラウザ上にこの ES6は実装されていますし、node.jsにも実装されています

言語仕様は非常に先進的なものであり、これまでのプログラミングの大きな考え方 (= パラダイム)を変更するほどのインパクトがあります 際立って紹介されているのが、アロー演算子とか Promiseとかいうものです Promiseに関しては未だ勉強を開始していません 現在はアロー演算子の習得にかかっています

/*jslint node: true */
/*jshint esversion: 6 */
"use strict";

const ary = [1, 4, 7, 9, 32, 43];
let reducer = (accumulator, initialValue) => accumulator + initialValue;
let result = ary.reduce(reducer);
console.log(result);

ここで、最初の2つのコメント欄が無いと、jslintという文法チェッカーでエラーを吐かれます

このプログラムは、配列の合計を求めるという他愛もないものですが、重大なパラダイムシフトがあるのです とっても難しいのですよ

ヘルシンキから神戸 そして 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を行わせて頂きました

楽しく過ごしました