洗練化するデータ構造

鎌倉ライブデモンストレーションの公式Web Site構築中です こっそりと現在の姿お見せすると

http://kamakuralive.net/23rd/db_read/come_session_all_read.php

となるのですが、もちろん公式には未だ公開していません

このページの特徴は、参加して頂く方のデータを別のページでdatabaseに登録し、そこから読みだしているのです 従ってそのページにアクセスする方々は、常時データを更新することができ、それが瞬時に反映される、ということなのです さらに、データ構造を工夫してあり、たとえば ◯◯さんがどの時間帯に dutyがあり、それがぶつかっていないかどうかもすぐに判明できる、というものにしてあるのです このデータ構造を創造するのには随分と頭を回転させました 知力の勝負ですね

いやあひどい目に

8/23の火曜日は9:15 AMからTAVIを二例 (SAPIEN3 + CoreValve Classic)をさっさと 13:00までには終了し、17:00羽田発の千歳行きANA便に乗ろうと急ぎました 自動車で柏尾川にかかる橋を渡る時外を見ると、柏尾川がこれまで見たこともないような増水していたのです 自分は病院の建物の中にいたので知らなかったのですが、そう言えば月曜日から何回も何回も「警戒警報」が皆の携帯電話で鳴っていたのです 相当に大雨と風だったのでしょう

「これは飛行機も相当遅れるな」と覚悟して羽田空港に着くと、案の定その時点で既にこの ANA便は出発が一時間遅れ、いやきっと飛び立つ時には二時間遅れぐらいにはなるのでしょう と言うわけで、急遽 16:50発の AirDo便に変更したのですが、これも実際に飛び立ったのは 17:30でした

そんなこんなでようやく札幌に到着し、その夜の約束にはかろうじて間に合いました

水曜日には 16:30発の ANA70便で羽田に戻る予定でしたが、これも千歳空港に到着したらば、既に「遅延します」とのこと、仕方なく待っていると、何とその後の便 ANA72便が先に搭乗案内を開始しているのです これってどう?

結局予定の便は 17:30と一時間遅れで出発したのです 羽田空港での打ち合わせがあり、約束の時間から一時間遅れ、皆様方にお待たせさせる結果となってしまいました 申し訳無い

まあ、空前絶後の歴史上初めての北海道台風上陸三連発ですので、仕方ないと言えば仕方無いのですが、誰か優れたコントローラーがいてくれれば、もう少し改善できていたのではないのかな?

JavascriptからPHPに変数を渡すには?

羽田から福岡に飛ぶ飛行機の前後で「如何にして Javascriptから PHPに変数を渡すことができるか?」について考察しました

この逆は簡単にできますし、実際の Web programmingの場面でも時々使用します しかし、それとは逆方向となるとこれが難しいのです というよりも少なくとも汎用的にはこれは不可能です

その理由というのは、Javascriptは Server側で動作する node.jsのような javascriptを別とすれば、基本的には Browser上で動作する クライアント側の言語および環境なのです

これに対して PHPは完全に Server側で動作する言語なのです ですから、基本的にはクライアンとらサーバーへのデータ伝達形式である、POSTやGETあるいはCookieを用いねば情報伝達ができません それは securityの観点からも当然のことなのです

たとえば、Javascript側で <div id=”some”></div>のようにして このidに対してdocument.wirte()を用いて書き込む、それをPHP側で読み取ることは無理をすれば可能でしょう しかし、それとしても PHPを動作させねばなりません

これらの理由で Javascript -> PHPは不可能なのです

ついに実現しました

本日はCVIT九州沖縄地方会でのサテライトに呼ばれています ここ10年間近く毎年この夏には呼んで頂いています まあ年の功でしょうか?

でも同じ会において毎年呼んで頂いて毎年何らかの話をする、というのは結構辛いものがあるのですよ 毎年何かしら新しい視点を提言させねばならないのです

という訳で暫くしたらば羽田空港から福岡に飛びます

この二日間悩んでしたプログラムが解決しました Ajax通信を用いてページ遷移無く、列名ボタンに応じてクリックする度に、自動的に並び替える、という良くあるインターフェースの実現なのです

久しぶりに jQueryを用いた Ajax通信プログラムを書いたので、昔のことは完璧に忘れており、調べなおしたり大変でした しかし、苦労は報われる、まるでここ数日間の日本選手による金メダル獲得のようです

結局何が悪かったか ことは簡単でした 動的に<Table><th></th><tr><td>・・・</td></tr></table>を生成しているのですが、この中で当然のことながらボタンも生成します しかし、どうしてもそのボタンをクリックしても、click eventが発生していないのです

これには随分と苦しみました jQueryの APIである .live()は既に廃棄されているようであり、現在では .on()に取って代わったとのことです それで .on()を用いて動的生成後にevent handlerをつけてみたりしたのですがどうしてもうまく行きません

ふと気が付き、これまでは

$data.= '<form action="***.php" method="post">';
$data.='<td>';
$data.='<button type="button" name="**">Name</button>';
$data.='</td></form>';

としていたのを

$data.='<td>';
$data.= '<form action="***.php" method="post">';
$data.='<button type="button" name="**">Name</button>';
$data.='</form>';
$data.='</td>';

のようにしたのです 要するに <form></form>要素を <td></td>要素の中に入れたのです 今までこんなこと関係ないだろうと思っていたのですが、それが大間違いでした こうすることにより無事 event handlerもそのまま継続され、思うどおりの動作をするようになりました

ありがたいことです

昨日外来診療をしていて、半年ぶりに来診される患者さんから、「最近 先生の具合が悪いのでは? と心配していました 大丈夫ですか?」と言われたのです

「何時もは先生のブログ数日に一回は更新されているのに、最近は何と一ヶ月間更新されていないので心配しました」とのことでした

いやあ 少し感激しました 実際、先月は疲れてしまい、ずるずると更新をサボっていたのです でも反省しました そのように見てくれている方が一人でもおられる、というのは嬉しいものですし、やり甲斐もあります

そんなことで、最近はTAVIについて記載しませんでしたが、TAVIも着実に症例をこなしています 最近の話題というのは SAPIEN3を用いることができるようになり、TAVIの確実性と安全性が格段に向上したということと、もう一つ 次世代のTAVI deviceである あっと、治験中なので名前出すのは問題かもしれませんので名前は出しませんが、それの小口径治験が先日当科で2例植えこんで終了したのです このディバイスはこれまでのTAVIの問題点を大きく改善するものであり、治験で多くの症例の経験を積まさせて頂きました 早く患者さんに日常臨床の中で使用できるようになることを祈っています ああ あまり言い過ぎると日本国内審査に干渉する危険性がありますのでこれぐらいにしておきますよ

という訳でTAVIもちゃんと行っていますし、また昨日なんて数例のPCIだってしたのですよ 本日はこれから新しい薬剤溶出性ステント治験の打ち合わせで霞ヶ関に行くのです

ようやく解決

今 Ajax通信を用いたプログラム作成していま Ajaxは二つのページの間を渡り歩くため、理解するのが難しいのです

今作ろうとしているのは databaseより読み取った表形式データをソートし、それをページに表示するのですが、ページのhead部分をクリックすると逆向きにソートされる、というようなよくある表示なのです

ページそのものを書き換えるのであればそんなには難しくありませんが、ページ書き換えは Webの世界ではコストが大きいのですから、Ajax通信で DOMを書き換えるべきなのです

ただ単に書き換えるのであればまあできます しかし、クリックする毎に反対向きにソートするようなものは .toggle()とう jQuery関数がどうやってもうまく作動しないため、工夫が必要でした そしてこれが解決策です

$("#name").click(function() {
			if (this.value == 'ASC') {
				this.value = 'DES';
			} else {
				this.value = 'ASC';
			}
			$.post("doctors_list.php", {name: this.value}, function(data) {
					$("#dataarea").html(data);
				});
		});

これにより id=”name”のボタンがクリックするたびにそのvalueが ASCとDESの間を交互に切り替わりうまく実現できました

自分の web component続きです

さてさて先の postingでは あれ以上長く書くと plug-inが作動しなくなったので この投稿文章を分割して掲載しました

つまり、作成したクラスを用いてどのようにするか?と言えば

<?php

$session1 = new Session($rows, 1);
$session2 = new Session($rows, 2);

?>

として、html中では下記のようにするのです

<div class="Session">
 <div class="Subsession">
  <?php $session1->domOut(); ?>
 </div>
 <div class="Subsession">
  <?php $session2->domOut(); ?>
 </div>
</div>

どうです? 以前の htmlタグ満載の最初のバージョンよりもずっとずっと分かりやすく、文章の論理構造も明確となりますよね

我ながら素晴らしい思いつきでした

いつの間にかかれこれ一ヶ月間 uploadしませんでした

このブログ 気がつけば一ヶ月間uploadしていませんでした この間に、島原でのライブ、インド Chennaiでのライブ、そして先日の TAVI関連学会である J-TVTなど色々とありました

何しろ暑くて暑くて とても気力が追いつかなかったのです それと何を思い立ったか、急に高等数学の勉強を始めたのです 自分自身の高校時代、理科系の数学は、数IA, IBそして数IIBだったと思うのです いわゆるゆとり世代のはるか前で、厳しく受験勉強を迫られていた時代です

数学の教育課程の中には、もちろん線形代数、三角関数、複素数などはありますし、ベクトルもあったと思います しかし中心は微積分だったと思います 決定的に欠けていたのは行列なのです 考えてみれば行列の学習を全くしたことが無いのです なんで今さら行列を? と思われるかも知れませんが、行列の考えとか、計算とかは現代世界で必須のものなのです 気がついてみれば僕には行列を理解していない、という根本的欠陥があったのです

それで Amazonで色々探し、一冊200円程度の中古の「わかりやすい」シリーズの数学本を購入して勉強を始めました 非常に平易に書かれていて僕のような老境の者にも理解できます 理解はできるのですがすぐに忘れていくのです 今も折角覚えた行列の掛け算のやり方忘れているのです あああああ まあ繰り返して学習していくしかありませんね

こんなことが医療と何の関係があるの? と言われる方も多いでしょう でもね、何処で何が関係しているのかなんて分からないのですよ 何より知的欲求が僕にそれを強いるのです それだけで十分でしょう もっとも僕には下心があります それはこれらの高等数学の勉強は自分のプログラミング・スキルの向上に絶対に役立つだろう、という裏付けがあるのです 現実に今話題の、例の碁の世界チャンピオンを破った Googleの人工知能、あれの理解には絶対に行列が必要なのです

そんなこんなで、ここ数日間 再びプログラミングに向かっているのです 色々と夢の中でも考えてきました html文書をどのようにコンポーネント化できるか? という命題です もちろんこれには Javascript frameworkである Reactや、AngularJSなどたくさんあります しかし、それらをゼロから勉強するのはとても困難です 少なくとも僕には困難です せいぜい jQueryぐらいです

そこで、PHPの classを用いて何とかできそうだ、という予想の下にやりました 何をしているか? と言えば 鎌倉ライブのプログラム作成および公開用のホームページ作成なのです これをReal Timeにon-lineでプログラムの更新ができるようにしたいのです しかも権限を持った人間は複数人が更新を可能とする、というシステムの構築です

まず行ったのは、プログラムの骨子作成なのです ここにはどうしても htmlという文章論理構造記述言語でしかあり得ません その第一版は以下のようなものです

<div class="container">
  <h1 class="text-center text-danger">EVTセッション第一日目 (12月17日[土曜日])</h1>
  <div class="row">
    <div class="col-lg-11">
      <div>
        <div  class="session_title">
          <form method="post" action="db_entry/evt/evt01.php">
            <button type="submit" class="session_title" name="sessionNo" value="1">
            <div>
              <div class="fleft"> 
                <?= _Q(mb_substr($rows[1]['begin'], 0, 5)); ?>
                -
                <?= date("H:i" , strtotime($rows[1]['begin']) + $rows[1]['duration']*60); ?>
              </div>
              <div class="fright">
                <?= _Q($rows[1]['sessionTitle']); ?>
              </div>
              <div class="fclear">Session Co-Sponsor:
                <?= _Q($rows[1]['cosponsor']); ?>
              </div>
              <div>Venue:
                <?= _Q($rows[1]['venue']); ?>
              </div>
            </div>
            </button>
          </form>
          <div  class="col-lg-10 session_sub">
            <div class="subsession">
              <form method="post" action="db_entry/evt/evt01.php">
                <button type="submit"  class="subsession_button" name="sessionNo" value="2">
                <div class="fleft"> 
                  <?= _Q(mb_substr($rows[2]['begin'], 0, 5)); ?>
                  -
                  <?= date("H:i" , strtotime($rows[2]['begin']) +$rows[2]['duration']*60); ?>
                </div>
                <div class="fright">Session Subtitle:
                  <?= _Q($rows[2]['sessionTitle']); ?>
                </div>
                <div class="fclear">Chair:
                  <?= _Q($rows[2]['chair']); ?>
                </div>
                <div>Moderator:
                  <?= _Q($rows[2]['moderator']); ?>
                </div>
                <div>In-Cathe Interpreter:
                  <?= _Q($rows[2]['interpreter']); ?>
                </div>
                </button>
              </form>

もちろん<?= _Q($rows[2][‘interpreter’]); ?>などというPHPのhtml植え込み書式を使用しています  _Q( )という関数は、htmlspecialcharacter( )関数のラッパーです

ここでの問題点は、似たようなコードが繰り返され、<div></div>タグが多用されているため、ぱっと見て構造(深さ)が分からない、という点です

これをもっとも必要な <div>タグでこの部分をくくり 例えば

<div class="Session">
 <div class="Subsession">
  <?php $sessio1->domOut(); ?>
 </div>
 <div class="Subsession">
  <?php $session2->domOut(); ?>
 </div>
</div>

という風にできれば文書の論理構造がより明確になります これをhtmlの中でどのように実現するか? 鍵は PHPの classです これまで僕は何万行も PHPを用いて Web programmingをしてきましたが、実は classを避けてきました これは変な話であり、C++を用いてプログラムする時には平気で classを用いてるいるにもかかわらずです

そこで classを勉強して以下のような姑息的プログラムを書きました まずクラスの定義です

<?php
class Session {
		private $value = '0';
		private $rows = array();
		public function __construct($rows, $value) {
			$this->setRows($rows);
			$this->setValue($value);
		}
		public function setRows($rows) {
			$this->rows = $rows;
		}
		public function setValue($value) {
			$this->value = (Int)($value);
		}

		public function domOut() {
			$n = $this->value;
			$row = $this->rows;
			echo '<form method="post" action="db_entry/evt/evt01.php">';
			echo '<button type="submit" class="session_title" name="sessionNo" value="'.$n.'">';
			echo '<div>';
			echo '<div class="fleft"> ';
			echo _Q(mb_substr($row[$n]['begin'], 0, 5));
			echo ' - ';
			echo date("H:i", strtotime($row[$n]['begin']) + $row[$n]['duration']*60);
			echo '</div>';
			echo '<div class="fright">';
			echo _Q($row[$n]['sessionTitle']);
			echo '</div>';
			echo '<div class="fclear">Session Co-Sponsor: ';
			echo _Q($row[$n]['cosponsor']);
			echo '</div>';
			echo '<div>Venue: ';
			echo _Q($row[$n]['venue']);
			echo '</div>';
			echo '</div>';
			echo '</button>';
			echo '</form>';
		}
	}
?>

そしてこれを実際に使用するには以下のようにします