Ajaxに悩んだ二年間

現代のWeb PageはAjax通信を用いてページの書き換え無しに表示データを更新する仕組みが広く使われています。Ajax = Asynchronous JavaScript and XMLという訳の分からない言葉の頭文字をつなげた造語です。Ajaxが提唱されたのは、古く Internet Explorer5.0の時代に遡ります。ここいら辺に関しては、やはり Microsoft社とIBM社の功績が大きいようです。このIBMのエンジニアが投稿されたブログに詳しく書かれています。

僕もjQueryを用いてこのAjaxという仕組みを用い、データをデータベースから読み出しそれを用いてホームページのDOMを書き換え、動的にページを画面更新無く刷新するようなページをいくつも作成してきました。実はこれもIBMのエンジニアのブログを読んで出来るようになったのです。

さて、jQuery + PHP + MySQLを用いたAjaxはこれまでに色々なサイトで作成してきました。そのほとんどは期待した通りに動作してきたのですが、一つだけ躓く場面があったのです。現在の鎌倉ライブHpは2017年に原型を作り、それを踏襲してきたのですが、基本的概念は、Web上のMySQL databaseにデータを入力して、ユーザー・ページではその databaseからデータを読み出してHpに反映する、そのようにしたのです。

もちろん DBにデータ入力する時にはPWで保護された部分にアクセスし、一般ではアクセスできないようにしています。この時問題となったのは、下記のプログラム部分です。それが不思議なことにうまく行ったり、行かなかったりするのです。

 function ajax_search() {
$( "#search_results" ).show();
var search_val = $( "#search_term" ).val();

$.post( "tri_chair_mod_add01new_backend.php", {
    search_term: search_val
}, function ( data ) {
    if ( data.length > 0 ) {
        $( "#search_results" ).html( data );
    }
} );

  }

これが時にうまく動作して時に動作しないのです。この原因についてどうしても難しすぎて分からなかったのですが、色々考えている内に、Ajaxとは Asynchronous (=非同期)とうのが本質だと思ったのです。Web pageは非同期で表示していかないとユーザーが待たされることになります。ですから、ある画面を描く時にも、あるいはデータを受け取る時にもどちらかがどちらかの完了を待つ(=同期)することが無く、どんどん進んで行くのです。これが原因ではないかと思いました。そこで以下のように変更したのです。

  function ajax_search() {
$( "#search_results" ).show();
var search_val = $( "#search_term" ).val();
        $.ajax({
            type: 'POST',
            url: "tri_chair_mod_add01new_backend.php",
            dataType: 'html',
            data: {
                search_term: search_val
            },
            async: false,
            success: function(data) {
                if ( data.length > 0 ) {
       $( "#search_results" ).html( data );
                }
            },
            error: function(XMLHttpRequest, textStatus, errorThrown) {
                alert("Ajax error happened!");
            }
        });
  }

つまり、Ajaxのdefaultである async: trueというのを敢えて async: falseにしたのです。つまり同期をとるようにしたのです。これで長年の懸案が解決しました。とっても難しい概念です。

San Francisco、そして日立の後はメキシコ

10月06日日曜日からはメキシコに飛びました そして、11日金曜日早朝成田に戻ったのです。今回は、メキシコ心臓病センター (INC)においてのワークショップと、その後の学会に招聘されたためです。メキシコには何回もこれまで行っているのですが、かれこれ1年ぶりでしょうか? 懐かしい気分でした。

中南米諸国にTRIを普及せんと活動してきました。大分疲れましたね。でもその成果は大きく、INCの中には Simulatorを含め、TRIトレーニング室が、日本国政府と共同で設立され、既に2年間が経過し、その間に、メキシコ全土でのTRI普及率は当初の数%から現在では70%に達しているのです。これにより、入院期間が短縮され、治療可能な患者さんの数も増加したのです。このインパクトは心臓発作が国民の主要死因であるメキシコではとても大きいのです。最後の日には、メキシコの先生方と僕が集まり、レストランで食事食べながらこれまでの総括と、今後の方針の話し合いをしました。とても有意義な会でした。

メキシコ医師たちとの話し合い

そして、金曜日は6:50AMに成田空港に到着し、それから自宅に一旦戻りシャワーを浴びて、そして病院に出勤、10:00AMより外来診療を開始しました。流石にその日は疲れました。

3回目の日立訪問

10月03日は12:45発の品川発常磐線特急に乗り、茨城県日立に向かいました。日立総合病院での院内ワークショップに参加するためです。PCIの最中

実は2012年12月、未だ東日本大震災の傷跡が痛々しく残っていた日立総合病院に初めて訪問させて頂き、一例ライブで治療させて頂きました。そして、今回は二回目のライブ治療でした。この間一回講演のみで日立を訪問させて頂いたことがあります。

日立駅はとても奇麗な駅であり、改築の済んだ日立総合病院もとても奇麗な病院でした。ライブはとても楽しく快適に行わせて頂きました。

日立総合病院カテ室で
日立総合病院カテ室で

9月の忘備録-2

さてCVITの翌週9月24日には、羽田空港からサンフランシスコに飛びました。これはどうしても避けて通れないインターベンションの学会 TCT (Transcatheter Cardiovascular Therapeutics)に参加するためです。しかも、今回は日本人として唯一の Geoffry O. Hartzler Mater Clinical Operator Award 2019という非常に栄誉ある賞を受賞したのです。

この授賞式準備のために、たくさんの写真を送ることを要請されました。昔の写真、実はあまり無いのですが・・・・、それをスキャンして贈りました。これも大変な作業でした。そして、主催者である Colombia Universityの Martin Leon先生と、Gregg Stone先生から当日何千人という聴衆のいる Main Arenaでインタビューかされる、そのようにも聞かされていました。これは無茶苦茶なストレスでした。実際僕はこの TCTにおいてライブ症例を衛星中継して会場に流したこともあります。しかし、インタビューというのはまた別の経験だったのです。本当に大変でした。

Main Arenaでの受賞記念インタビュー
Main Arenaでの受賞記念インタビュー

正直に言いましょう、このために背広を一着誂えました。これまではスーツと言えば、町中の量販店でした購入したことはありませんでしたが、今回は藤沢駅周辺のデパートで、きちんと order-madeのスーツを仕立てました。人生始めての経験だったのです。スーツの仕立てに3週間以上かかる、ということを初めて知りました。

授賞式を終えて、たくさん方々がお祝いの言葉を投げかけてきました。嬉しいのですが、とても恥ずかしい気分だったのです。まあ何はともあれ僕の方にずしりとのしかかっていたストレスとはこれで開放されたのです。この時のビデオは下記にあります

Master Operator Award 2019 in Main Arena

Master Operator Award 2019 Main Screen

9月の忘備録

9月19から21日は名古屋国際会議場においてCVIT(日本心血管インターベンション治療学会)が開催され、僕もさまざまな役割で出席しました。でももう自分自身で演題を発表することもほとんど無くなっています。皆の発表の座長したり、新たな薬剤溶出性ステント治験のとりまとめしたり、そんな役割です。

夜は「味仙」という中華料理で夕食を摂りました。名古屋市内に3店舗あるらしいのですが、とても賑わっており活気のある非常に大衆的な中華料理の店でした。ラーメンにはとても辛いものもあり、その隠語が「イタリアン」なのです。

味仙のイタリアン
味仙のイタリアン

辛い辛いとは聞いていたのですが、僕には辛くありませんでしたし、翌朝必ず「***が***なる」と散々言われていたのですが、そんなこともありませんでした。

今回のCVITは何だか運営に無理があり、スケジュール管理も重複していたり、どちらかと言えば無茶苦茶な運営でした。今までこんな学会経験したことがありません。それほどひどい運営でした。

気がつけば60年

10月になってから初めてのブログ投稿ですね この間とっても忙しく、また精神的にもたくさんのプレシャーがありました

本日はこれからメキシコに飛びます それまでの間ゆっくりしていると、テレビのニュースで香港での若い人たちが主力となった反香港政庁運動がどんどん激しくなり、ついには警官による実弾射撃の結果、二人の若者が傷ついたことが報じられていました そして、イラクでは反政府運動が激しくなり、ついに数十名の一般市民が殺害された、と報じられています。

そんなことを知ると、昔の何ともやるせない思い出がよみがえっってきます。それは今から50年前の1968年10月21日に新宿西口地下広場で起こったことです。今では「新宿西口騒乱事件」として日本国の歴史で唯一「騒乱罪」が適用された事件として歴史に記録されています。その時僕は大学入試に失敗し、浪人生活をしていてその日も、「駿台予備校四谷校」から自宅のある「阿佐ヶ谷駅」に戻る途中、電車が停まり、新宿駅で降車し、この新宿西口駅前地下広場での大混乱の場面に遭遇したのです。

あたりにはヘルメットを被ったたくさんの中核派、革マル派、その他色々な派閥の学生運動活動家の人々、手には皆角棒を握っていました。それと対峙する形で何百人という完全武装した警視庁機動隊員がいました。その周辺はあの独特の催涙ガスの匂いが立ち込め、時々機動隊員が攻勢をかけると活動家、そして僕も含めて一斉に逃げ出したのです。

僕自身は、その頃政治的にも無関心で、ただ翌年の入学試験再挑戦にパスすることだけを考えていました。その後も学生運動はどんどん先鋭化し、ついには1969年3月実施予定であった、東京大学入学試験は、「東京大学安田講堂事件」により中止となり、全国の受験生は混乱の中、日本各地に散らばって行ったのです。僕もその多数の中の一人として、大阪大学医学部に進学しました。

あの頃の、催涙ガスの匂い、目が痛くなり開けていられなくなる苦痛。そして、制圧する側の圧倒的な武力と装備、それらに為すすべもなく圧倒された敗北感と無力感、それらが蘇ってきました。自分自身もそれからの一年間で、大阪府警機動隊員に隊列を守っていた平和的なデモ行進の時に思いがけない暴力を受け、顔面血だらけとなりました。その時思ったことは、「機動隊員も同じ世代であり、学生運動している学生には反感があるのだろう。そして彼らも色々な精神的圧力の中で追い詰められているのだろう」ということでした。圧倒的な暴力を受け、自分の心は折れると共に、もうそのような活動に戻ることはありませんでした。それも良かったと思います。

今、香港では大変なことが起こっています。50年前、自分が感じたこと、そのように追いやった状況、それと同じ状況なのだと思います。他の国のことなので、何らかの主張をできる立場ではありません。しかし、イラクでも同じようなことが今起こっているようです。これも正確な背景を理解することは無理でしょう。そもそも歴史の中で起こっていることなので、どちらが悪く、どちらが良い、という二進法的解釈は不可能です。

しかし、この混乱の中でやがて人々は傷つき、そして死んでいきます。60年前の「60年安保闘争」では、東京大学学生であった樺 美智子さんが亡くなられました。

何故かそんなことを思い出す今日です。

jQuery libraryの読み込み判定

jQueryや bootstrapは CDNよりそのソースコードを読み込むのが常道です。これには理由があり、まず CDNはライブラリ読み込みに最適化されているので、自分のサーバーから読み込むよりも早い、そしてCDNより読み込めば プログラムの置かれている階層によらず読み込み先を変更する必要が無い、というものです。

ただ、localhostでインターネット接続せずにプログラムを書いていると CDNから読み込めずにプログラムが作動しなくなることもあります。localhostで開発している時にはこれでは困ります。そんな時に、インターネット接続しているか否かで自動判定すれば助かります。そのコードとしては、

 

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script>if (jQuery) document.write('<script src="lib/jquery.js"><\/script>');</script>

としたり、あるいは jQueryが既に読み込まれているか否かの判定として以下のようにするか

<script>window.jQuery||document.write('<script src="lib/jquery.js"><\/script>');</script><

とするか、あるいは phpを走らせて

<?php
  if ($_SERVER['SERVER_NAME'] === 'locallhost'
?>

として localhostかどうかを判定する、という方法がありますね

.bash_profileが反映されない!!

先日来 terminalの挙動がおかしくなっていました それは根本的には .bash_profileが反映されない、というものでした
したがって、たとえば composerにより laravel/installerをインストールしても、それが反映されないのです。正確に言えば、もっと訳の分からない挙動を示していいたのです
つまり、

$composer global require "laravel/installer"

として MacOSに Laravel installerをインストールします。そうすると bashの設定ファイル ~/.bash_profileの最後にきちんと以下の一文が書き込まれます

export PATH="/Users/******/.composer/vendor/bin:$PATH"

これにより terminalを再起動すれば、その部分も読み込まれ

$echo $PATH

とすれば、きちんと環境変数 PATHに追加されている筈です!

ところが、これが反映されないのです 何でだ??? もちろん

source ~/.bash_profile

として明示的に.bash_profileを読み込ませれば反映されますが、そうせねば反映されないのです。これは bashが壊れたか? とまじに思いました。

しかし、発見しました ネットでは見つけられなかったので誰か困っている方もおられると思いますのでここに記録しておきます。

ターミナルのメニュー
ターミナルのメニューから環境設定を選択する
環境設定メニュータブからシェルを選択
環境設定メニュータブからシェルを選択
シェルタブ選択すねると、「シェル無いで実行」というチェックボックスがある
シェルタブ選択すねると、「シェル無いで実行」というチェックボックスがある

このチェックボックスをチェックするとシェル内で新たなまっ更なシェルが立ち上がる感じで、~/.bash_profileが読み込まれません!!!

なんとなんとこんなオプションがあったなんて!!!

 

ようやく前に進めました

入門Haskellプログラミングを読みながら Haskellの勉強を未だに続けています 何回も何回も挫折の連続ですが、ようやくサンプル・プログラムが作動しました

 

— $stack ghci addressLetter.hs で読み込む
— そして以下のようにこの関数を呼び出すと出力が適切に変化する
— *Main> addressLetter (“Bob”, “Jones”) “sf”
— “Bob Jones – PO Box 1234 – San Francisco, CA, 94111”
— *Main> addressLetter (“Bob”, “Jones”) “ny”
— “Bob Jones : PO Box 789 – New York, NY, 10013”

  

addressLetter name location = locationFunction name
  where locationFunction = getLocationFunction location

  

sfOffice name = if lastName < “L”
                then nameText
                  ++ ” – PO Box 1234 – San Francisco, CA, 94111″
                else nameText
                  ++ ” – PO Box 1010 – San Francisco, CA, 94109″
  where lastName = snd name
        nameText = (fst name) ++ ” ” ++ lastName

  

nyOffice name = nameText ++ ” : PO Box 789 – New York, NY, 10013″
  where nameText = (fst name) ++ ” ” ++ (snd name)
renoOffice name = nameText ++ ” – PO Box 456 – Reno, NV 89523″
  where nameText = snd name

  

getLocationFunction location = case location of
                               “ny” -> nyOffice
                               “sf” -> sfOffice
                               “reno” -> renoOffice
                               _ -> (\name -> (fst name) ++ ” ” ++ (snd name))
  

このようなプログラムです 本からコピーしましたが、HaskellではPythonのようにインデントにも論理的に重要な意味があり、それを間違えると作動しませんし、compileもできません 何回はねられましたが最後に動作しました 出力例もコメントに記載しています

だいぶん頭脳が Haskell脳になってきました

最近感じるのですが、これまでの半年間以上に渡る苦闘の末に、いやまだまだ末ではないのですが、自分の思考がなんだか変わりつつあるのを自覚するようになってきました。要するに Haskell脳になってきているのです。もっともその道のプロの方から見れば「赤ちゃん」のように幼稚な脳でしょうが、それでも変わりつつあります。

そのように自覚するのは、別に Haskellの勉強をしたり、プログラムを書いたりしている時ではないのです。日常生活で、フト今までとは違った思考をしているのに気づくのです。ようやくここまで来ました

-- Haskellで書いた
--リストより先頭文字が一致した項目
--を削除するプログラム
-- remove0.hs

remove' hanbetsu [] = []
remove' hanbetsu (x:xs) = if hanbetsu x
                          then remove' hanbetsu xs
                          else x:remove' hanbetsu xs

test_array = ["apple", "banana", "avogado"]

このソースコードは remove0.hsとしてセーブされています。
これでターミナルから以下のように打ち込みます

$stack ghci

これによりHaskell Interpreterが立ち上がりますので以下のようにプログラムのソースコードである remove0.hs

Prelude>:l remove0.hs

とすることによりコンパイルされますそして

Main>remove' (\(x:xs) -> x == 'b') test_array

とすることにより”banana”のみ無くしたリストが得られます。