二日間バグで苦しみ

どうにも納得行かなかったのです それは、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ですクジラが貨物船のようにコンテナを積み込んでいる模式絵なのです 面白いですね

わーあいっ

今現在 Washington DCのラウンジで成田行き飛行機の出発を待っています その間に進歩して Chromeブラウザにこのようなものを出すことに成功しました

これは Docker containerで立ち上げた LAMP serverです

素晴らしいですね これは index.htmlに html文書を作成し、http://sample.localhost:8080/index.html にアクセスしたものです やったね やったね こうなるともう MAMPは不要となるのかな

本当のやったあ

この前の投稿ではタイトルが「やったあ」となっていますが、そのタイトルは実はこの投稿に対するものなのです

それと言うのも、このアメリカでの時差ボケの最中に解決したこと一つ それは Dockerで LAMPサーバーを Macbook Proの中に立ち上げることに成功したのです

といっても結構スキルの必要な作業であり、それを探すというのも一つの才能なのです 僕はサーチして このページに行き着きました いやいやありがたいことです

ただ、その記載の中に一箇所誤りがあり、そもそも良く理解していないので、何が誤りか検出するのに20分ぐらいを費やしました それは

./db/Dockerfile

DBサーバの設定ファイルです。
DockerHubにあるmysql:5.6を使用しています。

FROM mysql:5.6
MAINTAINER docker-db

COPY ./my.cnf /etc/mysql/my.cnf ※1

ここに一箇所誤りがあるのです それは簡単な話ですが、※1を削除せねばならない、ということです

それに気づいて修正したところ、見事に

docker-server$ docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------------
dockerserver_db_1 docker-entrypoint.sh mysqld Up 3306/tcp
dockerserver_web_1 docker-php-entrypoint apac ... Up 0.0.0.0:8080->80/tcp

というふうに mysqldとphpが立ち上がりました 感謝感謝です