遅々として進まず: Laravelとクエリー文字列

相変わらず Laravelと格闘しています これまでに静的なサイト作成に関しては克服しました。現在挑んでいるのは Databaseからデータを読み書きして、それにより動的にサイトを書き換えるものです。これに関しても、Laravelの枠組のみであれば、まずは大丈夫にまで進歩しました。

現在挑んでいるのは Ajaxを用いて画面遷移無しに、画面を書き換えるものです。これが難しい。

これまでの鎌倉ライブデモンストレーションのプログラムにおいては、生の php, jQuery, javascript, html, css, SQLを用いてこれを実現していましたが、少なくともそれと同等のものを Laravelを用いて実現したいのです。

これが難しく、ネットで調べても的確に記載されているページはありません。また何とかそれらしきものを発見しても、トライすると何やらうまく行かないのです。その過程で明らかなプログラミング・エラーは発見することもしばしばあるのです。自分でもブログに uploadする時、間違いが無いように注意しているのですが、 uploadするまでの過程でエラーを含んだプログラムを uploadすることがしばしばあります。これは、わざとやっている訳ではなく、 programming/bug fixに使用する頭脳の回転と、ブログに uploadする頭脳の回転が異なるからのように思います。少なくとも自分の場合はそうです。さて、先程理解したのは、Laravelを用いて Query文字列をどのように画面に反映するか? というものです。たとえば、

https://www.kamakuraheart.org/?message=SAITO

というものを web browser (Chrome, Safari, Edge, Firefoxなど)の url (ブラウザの上にある窓)に打ち込むと、これは、サーバーに対して、messageという名前の変数に SAITOという文字列をセットして送りました、ということになります。これはクエリー文字列というもので、アドレスの後に?に引き続いて入力するのです。正確には、このようにして打ち込むと、GETというインターネット通信の形式で、サーバーにデータが送り込まれるのです。サーバーはそのデータを処理してから、ブラウザに結果を送り返します。このようにして動的なサーバーが構成されるのです。

さて、この方法を Laravelではどのように実現するのか? それに悩んでいました。

さて、ここからは Laravelについてある程度分かっておられる人でないと何のこっちゃ? です

まず、ルートというものを設定します これは Laravelの各種ファイルの中に以下のように書きます (/routes/web.phpに記述)

Route::get('doctor', 'DoctorController@message);

このルーティングの意味するところは、たとえば、https://www.kamakuraheart.org/doctor?message=SAITO とアクセスがあれば、messageという変数名と、SAITOというデータをペアにして (これを php言語では、連想配列という形式で、プログラム中では、[‘message’ => ‘SAITO]と記述します。

そして今度はこれらのデータをどのように処理して、どこに流すか? を決める Controllerに支持します。先のルーターにおいて、messageというメンバー関数にその処理を任せる、と指示しました (DoctorController@message) そこで、/app/Http/Controllersの中に、DoctorController.phpというファイルをつくり、その中にメンバー関数を追加します

namespace App\Http\Controllers;
use App\Doctor;
use Illuminate\Http\Request;

class DoctorController extends Controller
{
    public function message (Request $request) {
        $data = $request -> message;

        return view ('doctor.show1', [ 'message' => $data ]);
    }
}

さて、この DoctorControllerの最後に、’doctor.show1’というのがありますが、これは、この Controllerからの戻り値を、/doctor/show1 というものを用いて (正確には、show1.blade.php というファイル)表示しなさい、ということを表します。

/resources/views/doctor/show1.blade.php というファイルに以下のように記載しました。

@extends ('layouts.app')
@section ('content')

<div class="form-group form-inline">
    これが受け取った値です<br>{{ $message }}
</div>

@endsection

controllerでは $requestという変数に、utl = ‘https://www.kamakuraheart.org/doctor?message=SAITO というものから、.org/doctor? 以降、つまり message=SAITO というデータが入っています。しかも、この$requestは連想配列の形式でデータが入っています つまり、[‘message’ => ‘SAITO’] という形式です。ここで、php言語の中で、$data = $request -> message; とすれば、 $dataの中に、SAITOというものが入ります。そして最後の [ ‘message’ => $data ]という連想配列データが show1.blade.phpに渡されます。つまり $messageという変数には、$data中身である SAITOが入っているのです。

これを htmlで表すと {{ $message }} となります。ただし、これは .blade.php という形式の Bladeというファイルです。

つまり、

http://www.kamakuraheart.org?message=SAITO

とブラウザに打ち込めば、最終的に 

これが受け取った値です
SAITO

という結果が表示されるのです。とてもややこしいですね。相当にこの考え方に慣れないとスイスイとプログラム書けないですよね。がんばろう

ついに壁を乗り越えた

いやあ長い時間がかかりました ついに高い高い壁を乗り越えることに成功したと思います

関係データベースにおいてその性能をもっとも発揮するのは、「多」対「多」のデータ構造に対するデータの出し入れでしょう

例えば、鎌倉ライブデモンストレーションでは一コマ 1時間15分から1時間30分ぐらいの「コマ」にプログラムを分割します。この「コマ」のことを session と呼ぶことにします。そして、各 sessionには属性として、{begin}, {end}, {title}, {description}, {sponsor}があります。これはそれぞれ意味するところは、開始時刻、終了時刻、そのコマのタイトルあるいは概念、そのコマの説明、スポンサー ということになります。各sessionには「司会」「討論者」「演者」「術者」などを配置せねばなりませんが、これらは何れも「人」であります。

従って、総括的に言えば、各sessionに対して何人もの「人」を関係付けねばならないのです。そこで、この sessionというデータの塊、これを tableと呼ぶのですが、sessionというtableが組みする「人」というtableを作る必要があります。

ここでは、doctorという名前の tableにしましょう。ここで最初に修正します。sessionやdoctorというテーブルには属性の塊がつまっているので、単数形よりも複数形の方が意味が通じやすいですよね。そこでこれらのテーブルに名称を sessionsと doctorsという複数形にします。これらのテーブルから一つのデータ塊を取り出せば、それぞれ sessionと doctorという単数形の呼び名になりますね。

鎌倉ライブデモンストレーションのプログラムを考えてください。朝から夜までいくつもの sessionsがあり、それぞれに参加する人々も複数 つまり doctorsあります。つまり「多くの」sessionと、「多くの」doctorsが意味的につながっている(関係している)のです。これが「多」対「多」の関係データベースということになります。

この関係を矛盾なく維持することは非常に難しく、2つのテーブルの間に、一つ中間テーブルを入れることが普通です。つまり、「多」対「一」 <–> 「一」対「一」 <–> 「一」対「多」というデータ構造にすることにより、結果的に「多」対「多」のデータ構造を実現するのです。

これを Laravelにより実現する方法が分からなかったのです。生の SQL/phpを使用すればこれまで何回も行ってきたので簡単です。でもこの数カ月間 Laravelを習得するために多大な時間、精神力、頭脳などを使ってきたのです。今更諦める訳には行きません。

そしてたった今実現しました。その証拠の snapshotがこれです

いやあ久しぶりです

随分と長いことこのブログを更新して来ませんてでしたね 申し訳ありませんでした

どうしても自分の気持が前向きにならなかったのです 何か特別のことがあったのでしょうか? いやいやそんなことはありません 何も特別のことはありませんでした 何時もの平坦な日常が続いていただけです。

もちろん、新型コロナに起因する皆が経験している閉塞感と不安 それはあります。でもだからといってブログ更新をしなかった訳ではないのです。まあ、何となく疲れた、辛い、しんどい、そんな気持ちがあり、考えてみれば、それらの疲労感のためにブログ更新をして来なかったのでしょう。

この歳になり、これからの自分の人生はどうなるのだろう? そんな不安に襲われます。強い不安ではなく、漠然としたものです。分かって頂けますよね。それは誰しもが潜在的に持つ不安です。人々を哲学に駆り立てる解決できない不安です。それと共に、今まで歩んできた人生に対する反省と、後悔 そんなものにも襲われます。そしてこれらの不安は漠然とした大きなものから、小さな具体的なものまで次々と向かってくる波のように自分の心に打ち付けてくるのです。

普段は明るく何の不安も無く過ごしているように見える自分なのにどうしてこんなことになっているのでしょうか? 新型コロナによってもたらされた社会を覆う漠然とした不安がそのきっかけの大きな部分でしょう。でもそれはきっかけにしか過ぎません。具体的なことはいくつもあります。

自分は世界中の誰よりも実臨床において経皮的冠動脈インターベンション(PCI)の分野で経験と実力を有している、そのように思いますし、それは世界中の人々も認めています。でも正直最近は、「本当にそうなのですか?」という自らに対する問いかけが沸き起こってくるのです。どのような時にそんな気持ちになるのでしょうか? あまり皆さん方には言いたくないのですが・・・・ 本来自分が鍛えてきた若手の手技を見ていて感じることがあるのです その斬新な発想と、恐れを知らない積極性、それを可能とする技術 それらを見て自らに対する脅威と自分の力に対する不安、その2つの想いが、双頭の龍のように自分の心の中に頭をもたげて来るのです。「今まで何十年間も自らの腕を磨いてきた、それなのに追いつき追い越されそうになるとは」。人はそのような状況を喜ばねばならない、と言うでしょうか? 

若手は技能だけでなく科学的にデータを纏め、それを論文として世に問う能力も優れています。振り返って自分はどうだったのか? 誰も科学的なデータ取りまとめについて教育を与える人はいなかった、いや 実はそのような機会を拒否してきたからなのでしょう この期に及んで言うべきことではないでしょうが、言い訳させて下さい。

自分が大阪大学に入学したのは 1969年のことです。その年、安田講堂炎上に象徴される東京大学入学試験が無くなった年でした。世の中は、学生運動と暴力的政治運動に覆われ、毎日のように警察機動隊とデモ隊の血で血を洗う暴力的衝突が起こっていて、まちなかにはサイレンの音と、催涙ガスの匂いが立ち込めていました。そんな年に入学し、卒業する時には必然的に「博士号ボイコット、非入局」をスローガンに掲げる「青年医師連合」のちっぽけなリーダーになっていました。

それでも、カテーテル手技に対する渇望があり、その道に進んでいったのです。この時に正しい科学的教育を受けていれば・・・ それが人生の中での取り返しのつかない後悔なのです。もちろん誰の責任でまありません。強いて言えば自分の責任です。

翻って若手を見ると、自由な発送の中で独特の感性に基づいて新しいことを解明し挑んでいく、そのように僕には見えます。正直その姿は羨ましいのです。

新型コロナが問題となってきた頃、2020年の2月初旬であったと思いますが、その頃から僕自身の問題として掲げてきたのが、自らの姿勢を前にやる、そのために今の自分でできること、それは Laravel PHP Frameworkに対する理解を深めることでした。この半年以上来る日も来る日も Laravelを理解しようと、してきました。初めは何処から手をつけていけば良いのか全く分かりませんでした。本をいくら読んでも書いてあることがさっぱり理解できないのです。でも最近はようやく言っていることが半分ぐらいは分かるようになってきました。

いやあバカみたいな話ですが、先週末よりどうしてもわからないことに悩んで来たのです。

The POST method is not supported for this route. Supported methods: PATCH.

<form class="form-group row" method="post" action="{{ url ("/session/{$session -> id}") }}">
    <!-- 擬似的HTTP method宣言 -->
    @csrf
    @method('patch')
    <input id="id" name="id" type="hidden" value="{{ old ('id', $session->id) }}">
    <div class="col-sm-6">
        <label id="begin">開始</label><br>
        <input class="form-control" name="begin" type="datetime" value="{{ old ('begin', $session->begin) }}">
    </div>
この問題解決に一週間近くかかりました。</pre>

エラーの原因は、@method(`patch`)でした 何が間違いか分かりますか? 正しいのは @method(‘patch’) なのです

そうとう大変でした

MacOS上に、MAMPで走らせている MySQL上に databaseを作成しています もちろんこれは Internet Serverに uploadするための開発用のものです

その中で 鎌倉ライブのための databaseとして kamakuralive_sessionsという結構データが蓄積された DBがありますが、kamakuralive.orgの HomePageを Laravelで書き直すという壮大な夢を実現すべすべく作業しているのに併せて、kamakuralive_sessionというDBからデータを一部 新たな DBである kamakura_liveというDBに移行しようとしてきたのです

これが結構難儀なのです 簡単に .csv形式で SQLからexportして不要なカラムを削除してそれから新たな kamakura_live DBにimportすれば簡単そうですよね

しかしながらそんなにうまく行かないのです これは「日本語」という壁が立ちはだかるのです。どうしてそうなっているのか知らないのですが、Microsoftの作成している表計算ソフトの王者 Excelが何と文字を Shift-JISという旧態依然たる文字コードを使用しているのです。

現代は UTF-8という文字コードを使用するのが全世界で一般的なのですが、Excelのみ Shift-JISを使用しているのです。要するに昔の悪しき慣習をそのまま引きずっているのです。時々、メールなどで文字化けすることがありますよね。あの原因のほとんどはこの文字コードの違いによるものです。

<?php
require_once('doctor_tbls.php');
// 文字コードのセット
function charSetUTF8() {
	mb_language( "Japanese" );
	mb_internal_encoding( "UTF-8" );
	mb_http_output( 'UTF-8' );
};
charSetUTF8();

// HTML出力時のQuoting関数
function _Q( $argv ) {
	return htmlentities( $argv, ENT_QUOTES, 'UTF-8' );
}


	$db_host = '127.0.0.1';
	$db_user = 'root';
	$db_password = 'root';
	$site_url = 'http://localhost/KAMAKURA_Live_SSL/';

$db_name_sessions = "kamakura_live";
//接続
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() );
}

$stmt = $pdo->prepare("SELECT COUNT(*) FROM `doctors` WHERE `email` = :email;");
foreach($doctor_tbls as $doctor_detail) {
    $stmt->bindValue(":email", $doctor_detail['email'], PDO::PARAM_STR);
    $flag = $stmt->execute();
    $count = $stmt->fetchColumn();
   //echo $doctor_detail['email']." ".$count."\n";
    if ($count < 1) {
        $key_list = "";
        $value_list = "";
        foreach($doctor_detail as $key => $value) {
            if ($value == '0000-00-00 00:00:00') $value = '2019-01-01 12:00:00';
            if (($key != 'id') && ($key != 'on2016') && ($key != 'on2017') && ($key != 'on2018')
                && ($key != 'on2019') && ($key != 'description') && ($key != 'sponsor')) {
                    $key_list = $key_list.", `".$key."`";
                    $value_list = $value_list.", '".$value."'";
            }
        }
        $key_list = substr($key_list, 2);
        $value_list = substr($value_list, 2);
        echo "INSERT INTO `doctors` (".$key_list.") VALUES (".$value_list.");"."\n";
    }
}

Laravelによりサイト公開

これまで Coronaが問題となってから、自分でその間に新たな考え方とかスキルを取り入れようとしてきました。そして選択したのが、PHP Frameworkである Laravelにより Home Pageを書き換えることでした。それが本日ようやく達成できました。

これまでの 湘南鎌倉総合病院循環器内科の Home Pageはこれでしたが、Laravelを用いて書き換え、このようになりました。もちろんこの間には見てくれが変化していますが、本質は urlを見れば分かります。urlというのはインターネットの世界での唯一無二の識別文字列です。どんな Browserにも上段に窓がありますが、ここに出てくる文字列が url なのです。そして、Laravelで書き換えた新しい Home Pageではその urlの欄を見れば、例えば以前のスタイルでは経皮的僧帽弁接合不全修復システム (MitraClip)のページを示す url = https://www.kamakuraheart.org/MitraClip/mitraclip.phpだったのですが、現在は https://www.kamakuraheart.org/MitraClip/mitraclip となっています。この2つの文字列何が違うかと言えば、本質的なものはね前者では .phpというファイル識別子(拡張子)がついていました。つまりこれは PHPというweb言語で書かれだプログラム・ファイルであることを明示的に示しています。しかし、後者ではこれがありません。単なる拡張子のある無しの違いにしか過ぎないと思われるかも知れませんが、そこには本質的な違いがあります。後者では mitraclipというものを明示的に要求しているのであり、その表現が PHP programであるとかいうことは関係無いのです。

とは言うものの、Laravelで作成したサイトのプログラムをレンタルサーバーで運用することは一般的には出来ない、とされているのです。それを実現することに随分と時間がかかりました。

Laravel Frameworkの Directoryに public/というのがあるのですが。その中のファイルは全て /www/という公開フォルダに置く必要があります。そうすることにより、たとえば kamakuraheart.orgとしてアクセスできるのです。そして、public/の中にある index.phpが公開されねばならないのです。index.htmlを潰しておけば、Web Serverは優先的に index.phpを見に行きます。僕の使用しているレンタルサーバーでは、/www/の直下に index.phpを置きますので、この index.phpを以下のように修正する必要がありました

require __DIR__.’/../vendor/autoload.php’;
$app = require_once __DIR__.’/../bootstrap/app.php’; というものを

require __DIR__.’/vendor/autoload.php’;
$app = require_once __DIR__.’/bootstrap/app.php’; に書き換える必要があったのです。

何れにしても順調に軽快に現在は動作しています。

超音波ガイド遠位橈骨動脈穿刺のデモ

さて、超音波ガイドで遠位橈骨動脈を穿刺するにはどうすれば良いでしょうか?

そもそも僕はカテーテル術者として動脈穿刺は脈拍を自分の指で感知しながら行う、それがプロだと思ってきました。そのようにして医師免許を取得した1975年から40年間以上してきたのです。

しかしながら、血管穿刺には超音波を使用すべきだ、その方が致死的出血などの重大合併症が低下する、そのように学問的に証明されてからかれこれ10年近くが経ちますが、自分の守ってきたやり方を変えるべき時なのです。

しかしこれまで慣れてきた指の感覚による遠位橈骨動脈穿刺から超音波ガイドに切り替えるのは容易ではありませんでした。自分なりに理論的な背景を考察したり、もちろん何例も経験を積み重ね、ようやく自分でも「極意を極めた」と思い込める領域に達しまた。それでビデオを uploadしました。世界中の方々に見ていただけるように英語で解説を書いています。ぜひご覧下さい。

エコーガイド橈骨動脈穿刺に挑む

僕が近位橈骨動脈アプローチを開始したのは、1995年10月のことですが、自身で遠位橈骨動脈アプローチを始めてからかれこれ4年ぐらいになります。

1995年といえば、未だ超音波診断機器も今とは比較にならないくらい古めかしいものであり、とても橈骨動脈の穿刺には使い物にならず、橈骨動脈穿刺は指先の触診で行われていました。

そして僕が遠位橈骨動脈アプローチを開始した時も、穿刺にあたっては指先の感覚、触診で行ってきたのです。しかしながらこの25年間で超音波機器はとても進化すると共に、医療事故軽減のため、エコーガイド下での血管穿刺法というのが発展してきました。この項 続きます・・・・

うーん また馬鹿なことに時間を費やした

自分でしたことを忘れている とんでもないですね

実は、https://www.kamakuraheart.org/のホームページを根本から変更しようとしているのですが、その過程で、まずは httpからhttpsに自動的に飛ぶように、トップに .htaccessファイル(このようにドットの前に何も文字をおかないファイルネームのファイルは OSから見てとても特殊なファイルであり、その中の htaccessという拡張子ファイルは インターネットサーバーがサーバーファイルの内容を解読する時に、解読直前に特殊な指示を受け取るものです)を置きました。

今回の内容は  
RewiteEngine On
Redirect peermanent / https://www.kamakuraheart.org/

というものなのです。これの意味するところは サーバーに対して、「はい以下のように書き換えなさいよ」

「書き換え内容は、ここにきたならば、必ず httpsに飛んでいきないさいね」というものです。これによって、http://www.kamakuraheart.org/でアクセスしてきたならば、必ず https://www.kamakuraheart.org/ という暗号化されたサイトに飛んでいきます。

この .htaccessファイルは自分で書き、自分で設定したにもかかわらず、コロッと忘れていました。そして、本日自分で http://localhost/kamakuraheart.org/でアクセスしたところ、アクセスできないのです。それで原因調べたところ、この自分で設定した .htaccessのためでした。localアクセスのためにはこのファイルを潰しておかねばならないのです。これに気づき、すぐに文の先頭に #というコメント印を入れることにより、localアクセス可能となりました。もちろん、この#挿入ファイルを uploadしてしまえば、インターネット上で、http://www.kamakuraheart.org/にアクセスできてしまいますので、それは意図しません。まったくもって細かいことにも注意せねばなりませんね。

よちよち歩きのブログ

これまでの10年間は超えるブログ、それを停止することはそれなりの決断でした。今回の COVID-19の流行に伴う世界全体と人々の心を覆うさまざまな不安に誘導され、今までと変わらねばならない、そのように思いました。

いざ、これまでを捨てて見ると これがあまり大したこと無いのですよね。そもそもブログに記録を残しておくことにどれだけの意味があったのであろうか? うーん、少なくとも備忘録としての意味はありました。でも、問題は「何を忘れないでおかねばならないのか?」ということであり、どうせ忘れてしまったらば、備忘録も意味を成さないように思いますね。あとは、昔を振り返り、感傷にしたることぐらいでしょうか。

まあいいのだ、これからの10年を積み重ねるのだ。

新生 新たな10年のスタート!

これまでも僕のブログを見て下さり、ありがとうございました。

今回、思うところあり、過去を捨て、これからの人生を生きていくことにしました。その証として、ブログを立ち上げ直しました。これからもご指導宜しくお願いします。