昨日のPCI

昨日は、日立から大渋滞の中、4時間ぐらいかかり、拝島/昭島まで移動しました 久しぶりに東京西徳洲会病院でPCIをさせて頂くためです 何時の間にか一年以上訪れていませんでした 東海大学八王子病院の松陰先生も合流されました

堂前くんが、僕の体調を気遣って慢性完全閉塞ではありましたが、優しい症例を用意して下さったので、14:00より開始したのですが、予定の二例が15:00までには終了しました

東京西徳洲会病院のみんなと

皆で記念写真撮影し、それから、福生の界隈を散策し、夜は西八王子のお蕎麦屋さんに行って楽しみました あっという間に年末です

非常に判りやすい説明ありがとう

ここに Mac OS-Xのメモリ管理方法についての判りやすい説明がありました 今勉強中なのです

Mac向けの開発言語として OS X v10.5 (Leopard) から Objective-C に代わって Objective-C 2.0 が導入されました.Objective-C 2.0 は Objective-C を大幅に拡張したものですが,その中の最大のものはガベージコレクタの導入でしょう.もはや retain/release は考えなくてよくなったのです.

その後登場した iOS (当時は iPhone OS)では Objective-C 2.0 が採用されましたがガベージコレクタは引き継がれませんでした.プログラマは手動で retain/release しなければならないのです.(リファレンスカウンタが使えるため C++ の new/delete よりははるかに安全ですが.)

OS X v10.8 (Mountain Lion) になり,この Objective-C 2.0 ガベージコレクタ機能は非推奨になりました.iOSとの整合性を考えると,iOSにガベージコレクタを搭載するか,OS X から再びガベージコレクタを取り除くかですが,アップルは後者を選択しました.(プログラマから見るとやや驚きですよね.)

そのかわり,Xcode 4.2 からコンパイル時に retain/release を自動的に挿入する機能が付きました.アップルはこの技術を Automatic Reference Count (ARC) と呼んでいます.

ガベージコレクタを前提にしたコードは変更の必要は(原則として)ありません.一方,Objective-C 1.0 時代のコードはおそらく NSAutoreleasePool を多用していると思いますが,この NSAutoreleasePool はサポートされなくなったため,書き直しが必要です.(おそらくいちばん簡単なコード移行方法は,retain/release を削除してしまうことです.)

日立総合病院訪問

昨日は朝鎌倉を出て、一路 湾岸自動車道から、常磐道を通り、日立市にある日立総合病院を訪問させて頂き、三例のPCIを行わせて頂きました
日立市を訪れたのは人生で初めてでしたが、神戸のように、海と山に挟まれた土地に、日立製作所関連の工場や会社が多数存在していました 日立総合病院は、東日本大震災により大きな被害を受け、現在でも100床が閉鎖され、新たに病棟を新築している最中でした 従って、正面玄関も現在は存在せず、仮の玄関があるのみでした
マシンは、二台の Philipsでしたが、その内の一台で手技を行わせて頂きました アシストされる方々の技量もしっかりしておられ、何も不安に思わず手技をさせて頂きました 主任医長の悦喜(えき)先生にもお世話になりました
P1020870

OSX 10.8

本日 OSX 10.8 (Mountain Lion)をインストールしました やはりOSのインストールというのは不安なものですが、何の問題も無く、upgradeできました。
最近、 Objective-Cのお勉強を始めたのです、「そんな、C++もろくにできないくせに、新たな言語を始めるなんて不謹慎」という非難が聞こえてきます。僕もそのように思っています。でも、何時か iPhoneのアプリ作りたいから・・・・
そんなことで考えていたのですが、僕が初めて Macに触れたのは、1985年くらいのことでした。当時は、Macとは言わず、Macintoshと呼ばれていました。最初の Macintoshは小さなディスプレーと、フロッピーが一体となったもので、確か Macintosh-SEとか呼ばれていたように思います 最初からその上で Killer Applicationの Paintなどが走りました あれを初めて使った時は感激しました
そして次第に Macintoshの世界に惹かれ、ついには 1988年には当時出たばかりの最初のカラー・バージョンである、 Macintosh-IIを手に入れました そして、開発コミュニティーである、 MacAppに加入し、当時の開発ツールであった、Macintosh Programmers’ Workbench (MPW) をインストールし、その上で、Fortranや PASCALそして C言語を遊んでいました その時に初めて Objective-Cのことを知り、そしてその言語により環境構築された Frameworkというものを知ったのですが、いかんせん当時は資料が少なく、何も理解できませんでした
それでも、 Inside Macintoshiという分厚い英語の書籍を購入し、勉強しました この本は今も記念に所持しています
その中で、handleという概念が出てきました これは、要するに pointerのpointerのことなのですが、当時のMac-OSはこの二重ポインタを多用してメモリー管理を行なっていました
そして今回 Objective-C 2.0の勉強を始めたところ、またもやこの概念に出くわすことになったのです、もっとも現在は handleという言葉は使用されていないようです そして OSXも Leopardになってようやく、このダブル・ポインタを 64 bitsに拡張して根本から変更が加えられた、ということを知りました
また、OSX 10.7 Lion以降、最新のオブジェクト管理方法である、ARC (Automatic Reference Counting)というものが導入され、それが iOS4.0以降の標準となったらしいのです。たくさんたくさん学ぶことがあって楽しみです

本日は札幌

今朝札幌に入りました 千歳はこの冬一番の冷え込みでマイナス15度でした たくかんの外来患者さんが待たれておりました 今年最後の札幌での外来診療を終え、本日は日帰りします
昨日は二ヶ月ぶりの TAVIでした 最近 TAVIというものが体で分かってきたような気持ちがします でも相変わらず学ぶことばかりです
昨夜は竹下くんの送別会を開催しました 竹下くんには四年半に渡り、鎌倉でものすごくお世話になりました 彼が循環器科としての体裁を整えて下さいました これから郷里長崎に戻られ、より一層有意義な人生を送られることを願っています
人生は交差点のようなものですね 色々な人との出会いがあり、ともに同じ道を歩み、別の交差点で違う方向に歩む そんなことの繰り返しです ずっと一緒に歩めれば良いのですが、そんな訳にも行きません その運命を受け入れ、前に進まねばならないでしょう
なんだか美空ひばり的心境です

本日はとても寒くて

今朝は冷え込みました 夜出かける用事があるため、今朝は自転車に乗らず、歩いてきました 従って、起床も 6:00AMとゆっくり目でした
比較的最短コースに近いルートで歩きましたが、とても寒く、「これは自転車で海岸通り通っていたらば、大変だった」と、実感したのです
病院でカンファランスに参加した後、藤沢公証人役場に行ったのです、一か月ぐらい前にも行きました
何でそんな所に行かねばならないか? と言いますと、シンガポール厚生省が、今度のシンガポール・ライブデモンストレーションでPCI術者を行うために、必要だと要求してきたからです
彼らの要求は、まずパスポートを認証しろ、でした これって如何にも矛盾ですよね、おかしいんじゃないの?
それが済んでから、今度は、専門医資格を認証しろ、です 本当に馬鹿じゃないの? という感じです
こんなこといちいち要求されていたらば、もう彼の国でPCIを指導する気にはなりませんね
まあ、そんな国、と思えばそれでもいいのですが、日本人の中には彼の国にカブレた人も多いので、「一体どうなってるの?」という思いです
ということで今朝のルートは
2012_12_19Morning_Walk

本日のPCI

昨日夕方に福岡空港に飛び、唐津の行きつけの日本でもご本の指に入る、という寿司の名店で当地の先生方と食事しました。相変わらず美味しい寿司、大将の才能が輝いています。それに、昨日は何時もよりも、一層気合が入っておられました。昨日のシャリは最高のものでした。絶妙の水加減と炊き加減、そして赤酢と塩、素晴らしいものがありました。松尾雄二さん、川崎先生、森先生、ありがとうこざいました。
そして、本日は 久留米の新古賀病院で何年振りにPCIを行わせて頂きました。ここでは川崎先生、芹川先生はじめ多くの先生方にお世話になりました。かれこれ四年ぶりでしょうか、新古賀病院を訪問させて頂くのは・・・
多分最後に訪れさせて頂いたのは、CVIT総会でのライブデモンストレーションで術者として行わせて頂いた時だったと思います。その時、会場から流れていた他の病院からの慢性完全閉塞のライブデモンストレーションで、とんでもないことになっているのを、カテ室で僕は手技を続けながら見ていた記憶があります。
今回は、3例の方の治療を行わせて頂きましたが、全員合併症無く、成功裏に終了でき、とても嬉しく思います。これから鎌倉に戻ります。鎌倉に戻ったらば、お魚を捌いて、そして塩や酢で〆て、下ごしらえするのです。今日しかできません。
そして、明日も忙しい日々です。

strcat()の考察2

さて、これまでに膨大な数のC言語によるプログラムが作られてきました。実際現代社会のインフラはほとんどC言語によって作られた、と言っても過言ではないでしょう。

それでは、実際にこれまではどのようにしてstrcat()を運用していたのでしょうか?

僕の推定は以下のようです

char buffer[256];
// 予め余分な文字列バッファを確保しておく

char* my_strcat(char* str1, const char* str2) {
  char *buftop = buffer;
  if ((strlen(str1)+strlen(str2)) > 256) exit(1);
  strcpy(buffer, str1); 
  while (*buffer++ != '\0');
  buffer--;
  while ((*buffer++ = *str2++) != '\0');
  return buftop;
}

つまり、冗長性を持った余分なbuffer領域をこのstrcat()関数の外で予め確保し、そこを用いてコピーや連結を行う、というものです。
これならば、安全ですよね。でもなんだかダサいですね。

strcat()についての考察

その後も char* strcat(char* str1, const char* str2)関数について考察続けています。これはC標準で定義されている文字列連結関数です。str1という文字列の後ろに、str2という文字列を連結し、連結された文字列をstr1に格納すると共に、関数の戻り値として文字します。実際にやり取りされているのは、文字列最初の文字へのポインタ(メモリ中のアドレス)だけであり、多量のメモリ・コピーは発生しません。

この関数を自分で実装する方法として、ネットでも多く公開されているのは以下のようなものです

#include <stdlib.h>

char* my_strcat(char* str1, const char* str2) {
  char* str = str1;         // str1先頭アドレスを確保しておく
  while (*str1++ != '\0'); // str1へのポインタを文字列終端\0に達するまで
            // 増加させる ループを抜けた時には、str1の
  str1--;         // 文字列終端の次に来るのでアドレスを戻す必要がある
  while ((*str1++ = *str2++)!='\0');
             .// str1にstr2の先頭から終端に到達するまでコピーする
  return str;
}

しかしながら、このプログラムを見れば分かるように、これではstr1というデータ領域を超えてstr2というデータが書き込まれてしまいます

C/C++ではstr1やstr2のようなローカル変数はスタック上に確保されますので、その結果、関数の戻りアドレスを確保してあったスタックも破壊されかねません。そうなれば、もちろんプログラム全体が異常終了してしまいます。非常に危険な buffer overflowという罠です。

これを避けるためには、stringクラスを用いるか、予めstr1用に巨大なバッファを用意しておくか、それとも HEAP領域から動的にメモリ・バッファを確保するかしかありません。もちろん、stringクラスでは内部的にバッファを確保してくれているのでしょう。

HEAPより確保するものとしては、例えば以下のようになります

#include <cstdlib>

char* my_strcat(char* str1, const char* str2) {
  char* str = new char[strlen(str1)+strlen(str2)+1];
  // 動的にHEAP領域から2つの文字列を入れる分メモリ確保
  strcpy(str, str1); // 新たなバッファにstr1をコビー
  strcat(str, str2);  // その後ろにstr2を安全に連結
  retrun str;
}

しかし、これでは重大な問題が発生します それはメモリー・リークというものです。この関数内ではHEAP領域から毎回 str1+str2+1の長さのメモリーを確保しているのですが、関数終了時に、それを開放していません。従って、この関数呼出を何回も繰り返していると、やがてHEAP領域が枯渇するため、突然プログラムが異常終了してしまいます。いわゆる実行時エラーが発生します。

この重大な問題を解決するためには、やはり C++のクラスという概念を使う必要があるでしょう。