あいかわらず無茶苦茶忙しい

この二週間ばかり無茶苦茶忙しく、何時の間にか4月にならんとしていますね

そもそも何でかと言いますと、まずは 3/22から/24と中国上海から自動車で1.5から2時間の蘇州 (中国語では SuZhou)で開催された CIT (China Interventional Therapeutics)という中国最大のインタベ系の学会に相変わらず招聘されていたからです この学会には日本人もかなり参加し、総参加者数は 10,000人にはなると思われる学会です それよりも何よりもその発表の内容レベルが非常に高く、日本循環器学会を完全に追い抜いている気がするのです もちろん CVITもです

もう今さらこの事態に危機感を感じることは失せてしまいました

そして、/24これは土曜日ですが、上海から関西空港に飛び、そのまま大阪宿泊し、翌日日曜日は 6:00AMよりある会合に参加というか主催し、 8:00AMより 日本循環器学会正式プログラムで座長、そして引き続いて Late Breaking Clinical Trialで MitraClipの一年成績を発表し、引き続いて Luncheon Seminarで MitraClipの講演をして、その後 Press Conferenceに出席し、ようやく鎌倉に戻りました

もうこの時点でクタクタです そして、3月29日は夜東京に移動、しかもこれは札幌東徳洲会病院より一旦鎌倉に戻った後、出発したのです 東京のホテルで打ち合わせ後、休み、30日金曜日は 9:00AMより東京駅八重洲南口のJP Towerで TokyoValves 2018の Preparatory Meetingを 13:00までぶっ通しで行い、いよいよ 14:00より TokyoValves 2018が開始されました そこでももちろん主催者として Rolesがあり、そして本日 3月の最後の日には 8:30に JP Towerに行き、本日と明日の Rolesに uploadを行い、いよいよ 9:15AMより本会が開始となりました そして、今までぶっ通しで dutiesの連続 ようやくホテルの部屋で休んでいます

しかし、これから Faculty Dinnerのため再び出かけねばなりません

明日も早朝より夜までびっしりと仕事があります 本当に日曜日も何もありません 疲れますね クタクタです ろくにプログラムにもとりかかれません

SELECTで選択した列数を PDOで PHPに渡すには

これはしばしば行う間違いなのですが、気が付かないと結構しつこいバグの原因となりますね

$sql = "SELECT COUNT(*) FROM `dr_tbl` WHERE `email` = :email AND `conf_id` = :conf_id;";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(":email", $_SESSION['email'], PDO::PARAM_STR);
$stmt->bindValue(":conf_id", $_SESSION['conf_id'], PDO::PARAM_INT);
$stmt->execute();
    //$rowCount = $stmt->rowCount();
    //echo 'Executed!'.$rowCount.'<br>';
if ($stmt->fetchColumn() > 0) {	// 既に登録されているので弾く
        // この時 fetchColumn()が戻す値は SQL文で得られた count(*)ということになります
        // この結果 SELECT文から正しい件数を知ることができます

 

二日間バグで苦しみ

どうにも納得行かなかったのです それは、http://www.tri-international.orgのサイトをサーバー移行した時に始まったのです

そもそもこちらの都合でサーバー移行したのではありません サーバー運営会社の意向に沿って移行したのです これまでずっと使用してきた Rental Serverは FirstServerだったのですが、それが時代の移り変わりと共に、Zenlogicという次世代のサーバー環境になったのです 正直僕はここら Cloudとか詳しくないので何が違うのか良く分かりません

この移行の時に、これまでの全データも移行したのですが、問題は MySQL Database Server Dataだったのです これも移行したのですが、それと共に phpMyadminという MySQLサーバーデータ管理の秀逸のソフトがそのままでは作動しなくなり、改めてインストール必要でした そしてこの時に、port 3307にインストールされたのです これが問題だったのです

そもそも現在はMySQL5.1が port 3307で作動し、MySQL5.0が port 3306で作動している、という変な状況が続いているのです だいたい port番号なんて普段意識せずに使っているのですよっ

そしてサーバー移行前のデータは MySQL5.0から MySQL5.1に自動的にコピーされ、一見すると同じデータが2つの DB serverにあるのです

さて、PHPプログラムでは Internetアクセスした時には、

$db_host = '127.0.0.1';
//$db_port = '3307';//コメントアウトしているので port3306のまま
$db_user = '**A';
$db_password = '**B';

という風に 普段は port 3306の MySQL databaseに接続しているのです しかし管理ソフトの phpMyadminは port 3307で接続していたのです 当初は同じDBがコピーされていたので、phpMyadminでいくらデータをいらっても これは 3307接続ですから、PHP programからはその変更は見えません

結果的にわけのわからないことになってしまったのです この portの問題に気づくまでには丸一日かかりました そして現在は $db_port = ‘3307’; この一文を活かしているので、全てが port 3307で作動している MySQLでプログラム全体が動いているのです

いやあこのバグは判明にずいぶんかかりました しかし、僕の頭脳が未だ明晰であることが証明されてある意味嬉しいですね

PHP scriptでのエラー表示

これまでずっと XAMPPを使用して Web開発してきたのですすが、XAMPPを使っている限り、PHP scriptのエラーは画面にその内容が表示され debugに重宝してきたのです

しかし、MAMPに変更してから、全くエラー表示せず、これはひょっとして設定の問題? と調べると案の定そうでした

現在MAMPでなく MAMP Proを使用しているのですが php.iniは PHPの versionsと同じ数あり、それをいちいち display_erros = Onに設定するのは大変ですし、そのように設定しても必ずしもエラー表示されないのです

これはエラーが本番環境で表示されることは危険なので MAMPの場合 defaultでエラー表示しないようになっているらしいのです

MAMPのPHP設定画面で Log errors: to screenというのをチェックすると PHP versionによってはエラー表示されるようになりました 当面はこれで行きますかね

それでもエラー表示されなければ各PHP fileの先頭で

ini_set('display_errors', 1);

を書き込むことにしましょう 但しこのまま本番環境に uploadすれば本番環境でエラーが表示されるようになり危険です 注意せねばなりませんね

ついに RAP and BEATのトップページに実装

これまでの積み重ねを経て、各種テストを行いました そして ついに RAP and BEATのトップページに登録症例数のグラフ表示を実装できました

動画で表示するようにし、自施設に関しては、赤グラフで表示するようにしました もちろん、ログインが誰により行われ、その人が所属する施設が自施設となります ここで問題だったのは、$_SESSION変数を如何にして Javascriptライブラリである D3.jsに変数として渡すか? でしたが これに関しては少し調べて簡単にできることが分かりました

ここに記載されていたように json_encodeを用いて jsonオブジェクトとして渡すのだそうです これは securityが深く関係しているようです 実際の javascript codeはかくも簡単です

// json_encodeを使用して$_SESSION変数を安全に javascript変数に変換する
    var hp_tbl_id = <?php echo json_encode($_SESSION['hp_tbl_id'], JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT); ?>;

この関数の第二引数はオプションであり、security上非常に重要だそうです

何だコリャ そして 素晴らしい

相変わらず神経痛で悩んでいます 眠れない 痛い 時間との勝負でしょうか

ところで今朝突然ひどい話に気が付きました MacOS High-Sierraとなって新しいディスク formatである APFSが導入されました この APFSは SSDに対して最適化されていることは有名ですが、HDDに対して使うなとは書いていません

僕は調子に乗って 外付け portable 3TB HDDを APFSで formatしてそれを TimeMachine backup diskの一つとして使用してきたのです 流石に 3TBですから何回 backupしても余裕がありました

昨晩一晩かけて残り 100GBぐらいになっているので TimeMachie backupしたところ、今朝気がつくと「エラー」となっているのです そして 「MacOSジャーナリングでないと TimeMachineのバックアップはできません」などとエラー表示しているのです

なになに 今更なんだ これまで何回もバックアップしているのに途中ではそんなエラー出てこない

まあ仕様ならば仕方ないと諦め このdiskを MacOS Journalingで formatしようとしたのですが、できない!!! 何と APFSで formatされた diskは APFSでしか formatできないのです

困りました Parallelsで Windows10を立ち上げ Windowsによりこの diskを formatしようとしたのですが 何しろ認識すらできません さあ困りました 3TB HDDがゴミになるのでしょうか

それで Googleさんと相談したところ、見つけましたここを そして救われました

世の中奇特で優秀な方がおられるのですね それにしても Appleはもう少し user friendlyになって欲しいなあ

こんな馬鹿なことで1週間潰した

さて、今から本格的にプログラム書こうと思っているのが、2019年に学会長を行うように指示されといるとある学会があるのですが、そのいわゆる学会プログラムやその他諸々を handlingするソフトの開発なのです 当然のことながら Smart Phone/Tablet/PCの全てに対応するように “Responsive Web Design”で開発するのです DBは慣れている MySQLを使用し、言語もこれも慣れている PHPを使用します

こんものいちなり書けないのでテスト・プログラムを作成し、local web serverでテスト繰り返すのですが全く作動しないのです

「えーーっ、なんでぇーーー こんな筈は無いはずだあ」と一週間悩んだのです 少しずつ修正しながらテストするのですが全く僕の意図を無視して動作しないのです

まあこんな感じです

// ここれはフロントエンドで SQLに探索語を渡す Ajax通信のルーチン
    $( document ).ready( function () {
      $( "#search_results" ).slideUp();
      $( "#search_term" ).keyup( function ( e ) {
        e.preventDefault();
        ajax_search();
      } );

      function ajax_search() {
        $( "#search_results" ).show();
        var search_val = $( "#search_term" ).val();
        $.post( "dr_role_find_backend.php", {
          search_term: search_val
        }, function ( data ) {
          if ( data.length > 0 ) {
            $( "#search_results" ).html( data );
          }
        } );
      }
    } );

 

そして受け取る方は、PHPとMySQLです

 session_start();
 session_regenerate_id(true);
 require_once('../utilities/config.php');
 require_once('../utilities/lib.php');	
 charSetUTF8();
 //接続
	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-&gt;getMessage());
 }

 $hp_name = strip_tags(trimBothEndSpace(mb_substr($_POST['search_term'], 0, 100)));	// 前後のspaceなど削除し、文字数を100文字に制限する
 $hp_name = strtoupper(mb_convert_kana($hp_name, 'ashK'));		// 半角英字大文字に変換する

 $stmt = $pdo-&gt;prepare("SELECT * FROM `hp_tbls` WHERE `hp_name` LIKE :hp_name ORDER BY `hp_name` ASC;");
 $stmt-&gt;bindValue(":hp_name", '%'.$hp_name.'%', PDO::PARAM_STR);
 $flag = $stmt-&gt;execute();
 $rows = $stmt-&gt;fetchAll(PDO::FETCH_ASSOC);
 
 if (!$flag) {
   		$infor = $stmt-&gt;errorInfo();
     exit($infor[2]);
 }

 

これで、検索語として病院名の一部を入力すれば、DBより検索してくれる筈なのです

しかし、しかし動作しない 本当にこの解決に一週間かかり、先程やっと解決しました

色々な問題があったのです まずは

trimBothEndSpace(mb_substr($_POST['search_term'], 0, 100))

という関数ですが、(1) mb_substrの引数を何時の間にか消去してました つぎに(2) trimBothEndSpaceという関数ですが、これは自作関数なのですが、それをlib.phpに作成してあり(ある筈)、それを読み込んで使用するのですが、何と lib.phpの中にこの関数を書いていなかったのです

この2つのバグのために、phpそのものが走らず結果的に echoで途中経過を出そうと思っても出せない そんな事態に陥っていたのです 本当に大変なバグ退治でした これも Ajax通信によるプログラムだからのことです 本当に非同期通信というのは難しいです これが解決してうまく動作しているデモ画面です

うまく Ajax通信が動作しているところ

どうして世の中うまく行かないのか?

まったく何事もうまく回らない うまく行かない もうつくづく嫌になってくる

とんでもないことが発生する 予期せぬことであり予防のしようも無い 構えておくこともできないのだ

 

Dockerで nginxを走らせる

今朝 Dockerで高速な Web Serverである nginxを走らせてみました

$ docker run -p 8080:80 nginx

これで別に terminal windowを開いて

$ docker ps

としたところ、

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
117c3fc5c632        nginx               "nginx -g 'daemon of…"   51 seconds ago      Up 51 seconds       0.0.0.0:8080->80/tcp   epic_nobel

と既に nginxが走っていることを確認しました

そこで、Macから browserを立ち上げ http://localhost:8080/ とアクセスしてみたところ、

Welcome to nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

このように、Welcome addressが出ました やったね

ちなみに今度はchrome, safari, firefoxの全てで作動しました

Dockerの何回目かの勉強

これまで何回も Docker習得に挑み、挫折してきました 挫折すると暫く、そうですね数ヶ月間 Dockerのことは忘れ、またブーメランのように戻ってくるのです さあ今度はどうでしょうか また挫折するのかな?

そもそも Dockerとは Container-baseの仮想コンピューターシステムです 何と言えばいいか、例えば自分の MacBook Proの上に、たとえば Linux serverを何個も同時に動かしたりできるのです これは現代コンピューターサイエンスのもっとも進んだ利用なのだと思います

何れにしても目標としては、自分の MacBook Proの上に、Linux Web + PHP + MySQL (つまりいわゆる LAMP: L = Linux, A = Apache Web Server, M = MySql database server, P = PHP or Python programming language)を構築し、それを使用して Web program開発をすることなのです 現在はこの目的のために MAMPを利用しているのです

実はアメリカから帰国する前に「やったあ できた」と思ったのですが、その後検討すると Chromeでしか作動しない、FireFoxや Safariでは動作しない、http://localhost:8080/ではアクセスできない などの問題点があり、これではプログラム開発できません

それでゼロ点に回帰してやり直すことにしました 本日はこんなこと学びました

MacBook Proの bash terminal上で

$ screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty

と入力し、Enterを押す そうすると

linuxkit-025000000001:~#

という待受になりこの時点で Linuxが Dockerコンテナの中で作動しだすが、ここで exitと入力すると あれあれ不思議 bash terminal上にこの Docker container上で動作する Linuxが遊び心でこんな素敵な画面を出力するのです

Welcome to LinuxKit

                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""___/ ===
          {                       /  ===-
           ______ O           __/
                          __/
              ___________/

linuxkit-025000000001 login: root (automatic login)

Welcome to LinuxKit!

NOTE: This system is namespaced.
The namespace you are currently in may not be the root.
login[483]: root login on 'ttyS0'
linuxkit-025000000001:~#

このままだと終了しないので、Ctrl-a kと入力することにより、Macbook Proの terminal bashに復帰します

こんなことですが、Dockerの始めの一歩でした 是非とも皆様方試みて下さい

ちなみにこのクジラの絵ですが、Dockerの trade markですクジラが貨物船のようにコンテナを積み込んでいる模式絵なのです 面白いですね