MacBook Pro/MAMP mysqlにパスを通すには?

MacBook Proで Laravelをいじっています 直接 MySQLにコマンドを発行せねばならない場面があり、これまで直接 MySQLをいじくっている時には、phpMyadminを立ち上げ、その中で SQLを発行していました

しかし、これは本来のやり方ではなく、本来的には MySQLコマンドを用いるべきです しかし、MAMPを使用している時にこれをどのようにすれば良いのかさっぱり分かりませんでした 金沢に移動する新幹線の中、この中は長野から富山の間は電波が通じず、インターネットアクセスに難儀するのですが、何とか調べました
$ code ~/.bashrc ## ホームの.bashrcを編集します

そしてここからは visual studio codeの中ですが、そこで以下の文を最後に追加します
export PATH="$PATH:/Applications/MAMP/Library/bin/"

そして terminalに戻りもちろんこれを叩いて反映させます

$ source ~/.bashrc

これで直接ターミナルから mysqlと打ち込めば mysqlを動作することができます 便利ですね

Laravel を MacOSにインストール – つづき

さてようやく MacOS上で composerがインストールできました というか既に何ヶ月か前にインストールしていたのに忘れていたのです

そもそも composerは何か? と言えば、phpを用いて web programを書くときに必要な諸々をサクッとインストールしてくれる便利な小槌と思えばいいのです まず行うことは

$ cd ~/target-folder/

とすることにより、目標とする target-folderに移動します

次いで

$ composer create-project "laravel/laravel=5.5.*" projectName

とすることにより、Laravel version 5.5一式をこのフォルダにインストールします これは大量のファイルをダウンロードしますので数分間かかりますよっ

$ cd projectName

とすることにより今作成したプロジェクト・フォルダに移動します そうすると artisanという phpで書かれたコマンドがこのフォルダには既にインストールされていまので、

$ php artisan --V

とすれば、僕の場合には
Laravel Framework 5.5.44というものが戻ってきました 実はこの artisanというプログラムは local serverを立ち上げるものであり、これで local serverを立ち上げるとその後 Laravelでプログラムを開発する時に面倒なことを考えずにできるのです

$ php artisan serve

これで local serverが  ip address = 127.0.0.1, port = 8000で立ち上がりましたので、ブラウザのアドレス・バーで localhost:8000とするかあるいはhttp://127.0.0.1:8000と打ち込めば見事 Laravelのデモページが立ち上がります

Laravelデモページ

Laravel再開

一度は挫折した Laravelに再度チャレンジです Macでインストールするのと Windows10でインストールするのでは大分やり方が異なるようです

Windows10では まずは XAMPPをインストールした方が良いようですね それでは まずは Macから ここは Terminalでの作業になりますね

まずは composerのインストールです これは簡単ですよ
$brew install composer

ところがここで以下のような膨大なエラー出現しました

==> Downloading https://getcomposer.org/download/1.8.0/composer.phar
######################################################################## 100.0%
Error: parent directory is world writable but not sticky
Please report this bug:
  https://docs.brew.sh/Troubleshooting
/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/tmpdir.rb:93:in `mktmpdir'
/usr/local/Homebrew/Library/Homebrew/utils/fork.rb:28:in `safe_fork'
/usr/local/Homebrew/Library/Homebrew/formula_installer.rb:743:in `build'
/usr/local/Homebrew/Library/Homebrew/formula_installer.rb:317:in `install'
/usr/local/Homebrew/Library/Homebrew/cmd/install.rb:326:in `install_formula'
/usr/local/Homebrew/Library/Homebrew/cmd/install.rb:256:in `block in install'
/usr/local/Homebrew/Library/Homebrew/cmd/install.rb:254:in `each'
/usr/local/Homebrew/Library/Homebrew/cmd/install.rb:254:in `install'
/usr/local/Homebrew/Library/Homebrew/brew.rb:88:in `'

こんなことで慌ててはいけません 何だか rubyで書かれた Homebrew管理プログラムが色々とシステムに書き込もうとする時に「それは越権行為だ!」というようなエラーですね こういう時は Google叔父さんに聴いてみます 検索したのは

Error: parent directory is world writable but not sticky
Please report this bug:

というものですが、そうすると早速このページにヒットしました これに従い$ sudo chmod +t /private/tmp
$ sudo chmod +t ~/Library/Caches/Homebrew
とすると Treminalからは何の返答もありませんが、再度 $brew install composerと打つと

==> Downloading https://getcomposer.org/download/1.8.0/composer.phar
Already downloaded: /Users/transradial/Library/Caches/Homebrew/downloads/5f21a93cda75f6de1acae0850021a00add848552341d23d14aa9e6afc17de4dd--composer.phar
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink bin/composer
Target /usr/local/bin/composer
already exists. You may want to remove it:
  rm '/usr/local/bin/composer'

To force the link and overwrite all conflicting files:
  brew link --overwrite composer

To list all files that would be deleted:
  brew link --overwrite --dry-run composer

Possible conflicting files are:
/usr/local/bin/composer
==> Summary
🍺  /usr/local/Cellar/composer/1.8.0: 3 files, 1.8MB, built in 2 seconds

というように何だか インストールされたみたいです ただ、僕の場合には既に composerがインストールされているのでそれを修正した方が良いよ と出ているようですので、この指示のとおりに$ rm '/usr/local/bin/composer'
$ brew link --overwrite composer
$ brew link --overwrite --dry-run composer
とすると見事にアンイストールできました そして今度は Laravelのインストーラーをインストールするために

$ composer global require "laravel/installer"

とすると 何やらたくさんのファイルが downloadされて インストール準備段階に入りました

実はこの段階でこのインストーラーなどのパスを通さねばなりません それで

export PATH="$PATH:$HOME/.composer/vendor/bin"

という一文を ~/.bashrcの最後に書き加えねばなりません これには vimとか visual studio code (VisutalStudio Code = VS Code)を用いねばシステム領域の書き換えはできませんので、

$ code

とコマンドラインから VS codeを立ち上げようとすると何と以下のエラー出現

/Users/transradial/.pyenv/shims/python: line 21: /usr/local/Cellar/pyenv/1.2.6/libexec/pyenv: No such file or directory
/usr/local/bin/code: line 10: ./MacOS/Electron: No such file or directory

さあ困った そこで、今度は”/usr/local/Cellar/pyenv/1.2.6/libexec/pyenv”で Google検索するとすぐにここにヒットしました この指示のとおりに

$ pyenv rehash

としたところ解決し、VS codeをコマンドラインから立ち上げることが可能となりました 要するに pyenvという python仮想環境が少し破壊されたので、それを自己修正したのですね さて、このようにそと VS codeでパスを無事通し、それを現在のコマンドラインに反映させるために

$ source ~/.bashrc

したところ、無事

$ laravel --version
Laravel Installer 2.0.1

となり さあこれで laravelをインストール可能となりました

さて、今度は Windows10でも行いたいと思いますが、こちらは仮想サーバーを別に立ち上げねばならないのかな? それとも php artisanコマンドで十分なのかな? 未だ検証していません これからの楽しみですが、時間があるかなあ???

こんなやり方大嫌い

外国から時々、PCIのCD/DVDが突然送られてきて、慢性完全閉塞の治療を頼まれることがあります 時にはその国の大使館経由であったり、その国のインタベ界の大物医師からのこともありますし、ご家族から送られてくることもありますし、患者さんご本人からのものもあります

当然のことながら先方は、齋藤 滋に頼めば何とかしてくれるだろう、きっと慢性完全閉塞を開通させてくれるだろう、という大きな期待を持ってコンタクトしてくるのです 僕に頼めば何とかなる、その場合には、往復の航空券を自腹で払っても、そして日本の健康保険制度が適応されず、完全なる自費診療となり数百万円の経費を支出してでも来られようとします

期待は大きいのですが、それを受ける立場の僕としてはとても荷が重いのです

  • そもそもご家族も同伴されないことが多いのですが、何らかの合併症が発生した場合、法律的な問題、倫理的な問題、医療費の問題 その他諸々の扱いが鮮明ではありません -> 結果的に僕一人に全ての責任を押し付けられる可能性があります

もちろん、これに対しては何らかの仲介会社が賠償保険など掛けている場合があり、その場合賠償金や、医療費についてはクリアとなると思いますが、少なくとも倫理的な問題は残り、大きな責任と心の重荷が僕一人に押し付けられると考えられる

  • 慢性完全閉塞のPCIなんて成功率がせいぜい 90% maximumですが、では 10%となった場合、相手は納得されるのか? その場合でも支払いはきちんとされるのか?
  • 実際問題、言葉は直接通じないことが多く、リスクを説明したりしようとしても何処まで理解されているか不明なままに手技に望まねばならない
  • 彼らの理解では、僕クラスの医師が直接手技を行うというのは、非常に特別であり、裏返せば「特別扱いされて当然」という意識がどうしてもある しかし、当院のような病院では、あるいは僕の主義として、特別扱いすることは良しとせず なので、どうしてもギャップが生じる
  • 実際に僕のスケジュールは非常にタイトであり、鎌倉にいる時には午前中 8:15AM頃から15:00過ぎまでぶっ続けで、昼食も摂ることなく外来診療し、そのまま休憩も取ることなく、手技に入るのです だから特別扱いなんて物理的にもあり得ないのです
  • 実際に治療戦略を検討したり、治療するかしないかそのものを検討するのはとても僕のフリーな時間を潰されます 実際に先日もあったのですが、いきなりCDが数枚僕の許に届けられ、仕方がないので時間をかけてそのCDを再生し(実際ここにも大きなリスクがあるのです そのCDに computer virusが仕掛けられていればどうなるでしょう)、DICOM Viewerに読み込もうとするとどうしても読めない、ファイル属性を調べると何と DICOM fileで無い! そんなこともあるのです あるいは、Powerpointに動画を貼り付けて送られてくる場合もあります DICOM formatでない資料は医療資料として認められないし、それに基づいて治療戦略を立てることを僕は絶対にしません

その他諸々の僕の思惑に関係なくPCIとなることが多いのです 勿論これまでに何人もの外国からの患者さんを当院で治療してきましたが、その国に僕が出かけて手技を行うのとは違うストレスが多いのです 皆さん方からすれば、僕の根城の鎌倉で治療を行うほうがストレス小さいのでは? と思われるでしょうが、そんなことは無いのです これが現地で手技をする場合には、現地の色々な状況を把握できますし、その地域で得られる最大限の情報を把握した上で、(日本国内での治療に比して制約は多いかも知れないが)自分の持ちうる能力を全て使用して治療に臨めるのです だから、それは自己発揮そのものなのでストレスは小さいのです

そうそう何を憤慨しているか? と言えば、暮れに同じように CDが数枚いきなり某国大使館経由で送られてきました 何処で僕の情報を得たのか知りません とにかく送られてきたので、正直「またか」と思いながらいやいやそのCDを DICOM Viewerで再生しようとしたのですが、全くできません、何と拡張子 .wmv つまり、Windows Media Viewerの formatだったのです これはそもそもフレームをエントロピー不可逆圧縮してから、時間またぎの不可逆圧縮かかっており、その結果 DICOM fileサイズの 1/10ぐらいになっているのですが、その分情報がロスしています 従って責任を伴う医療用資料としては認められません ここまでで一時間ぐらい自分の貴重な時間を潰されました そして、DICOM formatを要求したところ、インターネット経由で相当な時間がかかるも送られてきました

さてそれを見たのですが、CDは三枚ありました 患者さんは年齢不詳の男性であり、一枚は去年の秋に行われたCT冠動脈造影、次に渡されたのは二枚のCDで、一枚目は去年の11月のもの、二枚目は12月のもので、同じその国ではPCIで有名な施設のものでした 僕も実はこの病院にもう15年以上前になりますが、訪問したことがあります その時は未だ革命前でした 当時の大統領と二人で写っている写真もあります あの時は確か Siemens machineだったけど、と思いながら DICOM fileを解析したところ、やはり Siemensでした

さて、患者さんは数年前に冠動脈バイパス手術を受けておられ、そのグラフトが閉塞したようです そして11月の DICOMを見ると、右冠動脈の長い慢性完全閉塞に対して、両側経大腿動脈的インターベンションにより順行性と逆行性に Corsairなど用い、あるいは Anchoring balloonも用いながら手技が行われ、最終的に造影剤の漏出を伴い、不成功に終了していました 問題視したのは、その手技時間なのですが、何と6時間以上かかっているのです そして、二枚目のDICOMですが、今度は 2時間かかり、同じような手技が行われやはり不成功に終わっていました そして、さらに問題だと思ったのは、DICOM tagからは読み取れませんでしたが、明らかに Japanese style CTO PCIだったのです

さて、ここからは僕の推論に基づいた意見ですが・・・・

何処のメーカーが声をかけたのか知りませんが、明らかに日本人医師を招いて行ったものと思われます これって何なの? と思います 恥さらし そのように思います 節操が無いことに腹が立ちます そしてそんなに時間をかけるような技術的低レベルに腹が立ちます メーカーの方も反省して下さい 僕がその国に問い合わせれば全て明らかになりますよっ こんなやり方大嫌い!!

まあこれぐらいにしておきましょう ついつい熱くなってしまいましたね そもそも皆さん方は DICOM tagについてご存知でしょうか? 面白いので少しだけ勉強して下さい

実際 DICOM viewerが無くとも Binary editorや、Visual Studio Codeを用いれば DICOM tagは全て読み取れますよっ

意外や意外 できない!

先の postですが、Chromeブラウザを立ち上げるのには、MacOS上の terminalで

$open -a Google\ Chrome

とせねばならない、と書きました そして、これを単に chromeという名前で立ち上げるにはきっとリンクを貼ればいいのだ、とか書きました この時点で本気でリンクを貼れば解決すると思ったのですが・・・・

実はリンクを貼り、そのリンク先(エイリアスとも呼びますね)に実行権限を与えればいいのだろうと考えていたのです そこで

$ln -s /Applications/Google\ Chrome.app /Applications/chrome.app

としてシンボリック・リンクを貼り、実行権限を与えるために

$sudo chmod 777 /Applications/chrome.app

としたのです これで先の open -a /Applications/chrome.appとしましたが、そんな実行ファイルはありません と叱られてしまいました

ここで暗礁に乗り上げ分からなくなりました 駄目だ

こっ これは便利だ – ChromeやFireFoxをコマンドラインより起動する

Visual Studio Codeを editorにして JavaScriptの勉強をしているのですが、なかなか思いどおりに行きません

何が思いどおりにいかないか? と言えば JavaScriptプログラム単独を走らせるのは

$node sample.js

などのようにすれば、sample.jsというプログラムが走ります そしてこの場合の出力は console.log( )で書き出し、consoleに出力します

しかし、JavaScriptと言えば、やはりブラウザとの連携です そして DOMの操作です、そうなると 例えば index.htmlをブラウザ立ち上げてその中で JavaScript fileを読み込んで走らせる、そのような運用になります ところが、いちいちこれをブラウザより行うのは面倒です どうにかして VS Code内部でできないのか? と色々考えたり、調べたりしてついに見つけました

Chromeの場合には

$open -a Google\ Chrome index.htm

FireFoxの場合には

$open -a firefox index.html

これで良いのです 実は Safariの場合には

$open -a safari index.html

これで一発で該当するブラウザでそのページが開かれ、そして JavaScriptが走ります なんて便利なんだろう

しかし、Chromeだけ Google\ Chromeとせねばならないのは許しがたいですね この場合、リンクを貼るしか無いでしょう

知らなかった JSONでは ‘ を用いず、 ” を用いねばならない

最近のデータ表現形式では JSONを用いることが多くなっていると思います 何故ならば xmlのように冗長なものでなく、さらに各種言語で JSONを解読するルーチン (Parser)が言語の中に実装されているからです

しかし、これまで知らなかったのですが、たとえば

{
  "name": "saito",
  "age": 68,
  "sex": "M"
}

というものは JSONとして正しいのですが、一方

{
  "name": 'saito',
  "age": 68,
  "sex": 'M'
}

はエラーとなります

何が違うのでしょうか? 現在使用されているほとんどの言語では、文字列を囲む “文字列”と、’文字列’はほとんど同一です もちろん、言語によっては “”では変数を展開できるとか 細かい点では違うのですが、何れにしてもこの ダブル・クオーテーションでくくったもの文字列で、 シングル・クオーテーションでくくっても同じ文字列となるのです

ところが、JSONではダブル・クオーテーションしか認められていないのです この事実には結構皆ハマっているようです 僕も知りませんでした

思いがけないエラー原因

メルアドというのはある個人の IDとしても使用できます 中にはもちろん自分個人のメルアドを作らず、一つのメルアドを共有されている方々もおられますが、この場合どんなプライベートな連絡もその人々で共有されてしまいますので、プライバシーを保つことができません

そんなメルアドの特性からメルアドは IDとして良く使用されます そして、その人が登録されているか否かの判定にはデータベースをメルアドで検索し、見つかった個数が 0であれば登録されていない、という事実を利用します つまりプログラムに書けば以下のようになります

$stmt = $pdo->prepare( "SELECT COUNT(*) FROM `doctor_tbls` WHERE `email` = :email;" );  // (A)
$stmt->bindValue( ":email", $test-email-address, PDO::PARAM_STR );   // $test-email-addressをテストするためにpdoで変数をバインドする
$flag = $stmt->execute();  
// 検索を実行する
if ( !$flag ) {        
// エラーが無いかチェックする
  $infor = $stmt->errorInfo();
  print_r( $infor );
  exit;
}
$already_registered = $stmt->fetchColumn(); 
// COUNT(*)によりそのメルアドがDBに存在するか調べる 既に登録済のメルアドであれば、0ではない
if ( intval($already_registered) === 0 ) { 
// ここからメルアドが登録されているか否かのチェックとなる
}


if ( $already_registered === 0 ) { 
// こうするとこのブロックの中に入らない
}


if ( $already_registered == 0 ) { 
// こうするとこのブロックの中にきちんと入る
}

PHPには同一性判定として ==と ===の2つがあります ===は値のみならずその型もチェックします ですから、===の方が論理的に合っていますので、通常は ===を使用すべきです しかしながらこのように DBより読み込んできたりすると見かけは数字の0であったとしても型が異なるのです ですから、きちんと作動するようにするためには intva()関数により整数型に変換せねばならないのです これに気づくのに相当の時間がかかりました

Excelデータを二次元配列に読み込む

今 成田空港に向かう NEXの中でテストを走らせています もちろん Objectとして Excelの行や列を扱うのも良いのですが、MySQL側はあくまでも二次元配列という概念ですので、今後のために2次元配列に変換します その部分を作成しました

require '../vendor/autoload.php';

use PhpOffice\ PhpSpreadsheet\ Spreadsheet;
use PhpOffice\ PhpSpreadsheet\ Writer\ Xlsx as Writer;
use PhpOffice\ PhpSpreadsheet\ Reader\ Xlsx as Reader;
use PhpOffice\ PhpSpreadsheet\ Cell\ Coordinate;

$reader = new Reader();
//$reader->setInputEncoding('SJIS');
$spreadsheet = $reader->load( 'poster2018.xlsx' );
//$reader->setInputEncoding('SJIS');
$sheet = $spreadsheet->getActiveSheet();

$lines = array();
$max_row = 0;	// 今rowの最大数値
$max_column = 0;	// 	columnの最大値
$nlines = array(); // Columnを数字にした二次元配列

$row_counter = 0;
$column_counter = 0;
foreach($sheet->getRowIterator() as $row) {
  foreach($sheet->getColumnIterator() as $column) {
    $lines[$row_counter][$column_counter] = $sheet->getCell( $column->getColumnIndex() . $row->getRowIndex() )->getValue();
    // これで$linesという2次元配列に Excel dataが集積された
    // これからは $lines[n][m]のような二次元配列として扱うことが可能となる
    $column_counter++;
  }
  $row_counter++;
}
$max_row = $row_counter;
$max_column = $column_counter;

ここでキモとなるのが、Excelではそれぞれのセル座長は A1より始まる表記となっていることです 通常の二次元配列では[0][0]より始まる配列ですので、この変換が必要となります

また Excelファイルを扱う時何時も問題となるのが、文字コードです Excelでは DOSからの伝統で日本語文字コードは Shift-JISであり、現在のプログラミングで標準的な UTF-8とは合いませんし、文字化けが起こります

そこで、PhpSpreadSheetにも

$reader->setInputEncoding('SJIS');

というメソッドが定義されているのですが、最近の Excelで改善されたのか、何しろそのようなメソッドを使用せずに自動的に UTF-8に変換されるようです ですからこのメソッドは不要でした