何事もうまくいかないな

昨日はプックスペース栄和堂に行ってゆったりとした時間を過ごすつもりでした それで丁度 12:00頃 Cross Bikeで病院を出発し向かいました

そして店の前の自転車スペースで自転車に鍵をしてさあドアを開けようとすると何と Closedとなっていたのです

仕方なく諦め、自宅を通り過ぎて坂道の途中にあるのを認識していた別の Cafeに向かったのです 結構きつい坂道で、Cross Bikeのギアを思い切り lowにしたのですがその途端にチェーンが外れ、そのまま前ギアに挟み込み、いくら手で戻そうとしても戻りません 仕方なく、自転車を転がしながら自宅にトボトボと歩いて自転車を押して帰りました

そして自宅でドライバーなどを用いて何とか復旧しようとしたのですががっちりとギアにチェーンが挟まれ 何ともできず、修理に出さねばならない事態に陥りました この Cross Bikeは先日定期点検から戻ってきたばかりで、何となくギアに音がして、しかもチェーンの張りが問題ありそうでした 案の定こんなことになってしまいました

結果的に土曜日午後優雅にカフェで思索に耽る、その予定が全部駄目となりました 本当にこの世の中は思うようには行きません

それで、朝から MacBook Proで PyCharmを立ち上げ色々と設定していたのですが、内蔵する Terminal Windowを開くとどうも文字コードの関係なのでしょうか うまいこと動作しません 色々と探してみるとこのページに遭遇しました その通りに設定してみるとスイスイとターミナルが動作するようになりました ありがたい まあ思いどおりに行かないこともあれば 何とな解決することもありますね めげない めげない

ばかだばかだばかだ

何だか頭が馬鹿になっていく 明らかに頭の回転が以前より遅くなっている 明らかに頭脳の占める空間が狭くなっている

患者さんからよく「最近忘れっぽくて」と相談されます その時の僕の答えは 「忘れるって良いことですよ 長生きされていれば色々と嫌なこともあるでしょう もしもそれらを何時迄も覚えていれば楽しくないですよ 自然に任せましょう」

しかし、それはそうなのですが それにしても頭脳の回転が悪くなるのは許しがたいものです 最近自分のタイピング速度が遅くなってきていることも自覚します 特にこの 2016年モデルの MacBook Proのカチャカチャいうキーボードでは余計その傾向が目立つすのです これなんかも許しがたいことです

以前自分で書いた C++による Huffman Decodingプログラムのロジックをトレースするのに自分で時間がかかっています 頭脳空間の中に自分の書いたプログラムの論理空間をマッピングしれきないのです これは訓練で改善するのか? いな そう信じて再び挑まねばならない

あー馬鹿ですねえ 何を言っているのか支離滅裂です

ヘロヘロと光明

昨日はミヤンマー そして札幌でのTAVI 3例に引き続き、早朝から W治療を 4例実施、その間に外来診療をしながらです そして懸案の重症大動脈弁狭窄症の患者さんに対してどのように対処するか 議論の後、治療に踏み切りました

とても重症で併存疾患もありかつ救急で運び込まれてきた患者さんです 心臓血管外科、循環器内科、麻酔科、血管外科、看護師さん、技師さん、コーディネーター皆総出で 19:00から 23:00まで頑張りました

それから遅くに自宅に帰宅、一人で夕食食べながら MacBook Proを立ち上げメールを見ていたところ、Ron先生からのメールを受信、懸案の DICOM moduleなどを用いて 非圧縮DICOM XAを動画展開できそう、とのプログラムでした

素晴らしいです 漠然としていたモヤの中の色々が見えてきそうです これまでの 圧縮DICOM画像の解析と併せてもっと前に進めていければ良いですね それでこそ Pythonを勉強している甲斐があります

そして今朝は辛かったけど頑張って出勤です

今朝のツーリング

本日の勉強会

本日は勉強会「みんなのPython勉強会 #24」に参加してきました 最終的には参加者の総数は優に 100名を超えたと思います 三人のその道のプロが講演をされました もちろん講演は MacBook Proを駆使したもので、Powerpointはほんの一部でしか使用していませんでした

内容は#1 Geopython, #2 Web API, #3 Git/GitHubでした まあ Geopythonというのは様々な地理的データを色々なデータベースと組み合わせて可視化するものであり、その動作エンジンに Python特に Pandasを用いるものです 確か、以前に Rを用いた同様のシステムの本を読み勉強した記憶がありますが、すっかり内容は忘れました まあ、一般の方々からすれば Google Earthを思い浮かべれば大きな間違いは無いと思います

演者は東大理学部博士課程を終了したまあ頭の良い方で、今は起業され二名の会社のCEOとしてGeographical Programを開発されている方です

二番目は驚いたのですが、昨日 59歳となられた方であり、この方も社員8名の会社を起こしております そして SNSと Webを結びつけさらに電話で自動音声化するプログラムのための APIを開発されているのです 社員は、日本に彼含めて三名、一人は東京(彼)ですが、もう一人は京都の山奥、もう一人は何処か忘れましたが少なくとも数時間では到達できない場所、一名は韓国、一名はロシア、二名がマレーシアのジャングルの中、一名がインドネシア これで会社を日本でつくり、ビジネスをしているのです 何しろ officeが存在せず、いわゆる remote officeというもので自宅なんでしょうか どこでもよくインターネットで繋がってビジネス開発、プログラム作成をしているのです

59歳ですよ しかも、彼はまあ以前から Pythonをいじっていたらしいですが、Python Web Frameworkである Djangoは未だ一年しか経験が無い、とそのように言っておられました そして皆に「59歳の僕でもプログラム書けるのだから皆是非ともプログラム書いて下さい」です かっこいいよね

3題目は、Git/GitHubの話であり、正直僕は知っていることなのであまり聞かずに話題として出てきた slackにかまけていました

結局、19:00から終わったのは 21:20くらい、それから地下鉄麹町駅まで歩き、有楽町線で有楽町に出ました 有楽町は未だたくさんのサラリーマンがおられ、自然と足は駅ガード下の飲み屋さんに サラリーマンばかりの飲んだくればかりの集団 皆タバコ吸っています そこに一人で入りました そして食べたというか飲んだというか それがこれです

有楽町駅

何しろ有楽町駅ですよ あの「有楽町で逢いましょう」の有楽町駅ですよっ 歳が分かってしまいますね

酒や「はないち」

いやあ風情ありますね 昭和の風情です 有楽町駅ガード下です 値段はとても安い ここで摂った本日の夕食がこれです

本日の夕食
やはり日本酒に限ります

それはそうと今回たくさん新幹線に乗ったのですが、重大な事実が判明しました やはり、列車の旅と言えばその間に飲むお酒です ところが、JR東海管轄の駅、新幹線の中から日本酒などが無くなり、あるのはビール、酎ハイそしてワインだけなのです どういうことでしょうか? 日本酒やウィスキーを排除するというのは これは誰か調べて欲しいものです 山陽新幹線これは JR西日本管轄ですが、そちらには今でも置いているのです JR東海は何かあったのでしょうか?

まあこの有楽町で呑んだのは一人で40分間ぐらい そのまま山手線経由で東京モノレールに乗り、今は羽田空港第2ターミナルのエクセル東急ホテルに入っています 明朝は 6:25AM発の ANA便で千歳に移動せねばなりません そして、明日夜に鎌倉に戻り、金曜日は鎌倉で外来診療の後、小倉ライブに

土曜日小倉ライブで術者した後、鎌倉に戻り、その数時間後にフランクフルト経由でパリ そして EuroPCRで様々な役割です

全く休みがありません 流石にきついですねえ それでもプログラムの勉強は続けたいし、TAVIももっともっと深く知りたいし 所詮人間は頭脳で生きている動物なのです

やったあ

やったあ 新幹線フォームへの階段を10Kg以上のバッグを担いで駆け上りようやく新幹線に間に合った甲斐がありました 現在 18:45

ついに本日の main eventである 「みんなのPython勉強会 #24」に入り込むことができました 参加人数は多分 50名以上

驚いたのは僕ぐらいの年齢の方もチラホラおられるのです 僕は参加者皆 20歳前後のオタクっぽい人ばかりだと思っていたのですがこれは意外ですねえ 今まで参加したプログラマの集会とは大分趣が異なります

これから 19:00 – 21:00ここで勉強です

みんなのPython勉強会 #24

ああ ゾッとした

今朝は大変な思いをしました 今朝はTAVI 3件の予定ですが、その中の一例を検討している時に、自分の MacBook Pro Late 2016を例の Type C connectorで VGA端子につなげたのです そして OsirixMDを立ち上げた途端、Osirixの modeが勝手にかわり、これは大変と Osirixを shutdownして 再度立ち上げたのです

そうしたらば、何と Databaseが消えている!!!

自分の Macにはこれまで全世界で行ってきたそれなりの症例、bifurcation, LMT, DCA, Rota, たくさんのCTO、それに TAVI, MitraClip, Watchmanその他諸々が 400GBぐらいのデータして蓄えられているのです

それがそれが消えた!!!??

どうしようかと思いました そしてTAVIに入るにあたり、この動揺した精神状態をどうするか? こんな状態でTAVIに入れば患者さんに不利益

そこでとった行動は、「まず忘れよう、いざとなれば自分の過去を清算するつもりで、全てのデータ無くなってもいいさ」と思いを改めました これにより心は平静となりTAVIに臨み、そして素晴らしい結果で患者さんも眠りから醒め(当院では Conscious Sedation局麻でTAVIを行っています)、とてもお元気

これを確認して、そして再び Macに立ち向かい、自分で設定していた色々なことを思い出しました そもそも Osirix Databaseは自分の場合、~/直下においていたのを忘れていました

そして、それを Open Databaseで開いたところ、見事にありましたねえ 素晴らしいですねえ 何も消えていなかったのです ああ良かった

Huffman Code解読テスト

以前 そう 2012年に Visual C++で書いたテストプログラムです 基本的に標準的な C++ですので、MacOS XCodeでも動作する筈でしたので、少しのみ改変してテストしました

// JPEG_Analysis.cpp : programmed by S. SAITO, MD, FACC, FSCAI, FJCC
// created at 5:00AM on August 20th Monday 2012
// modified and tested for XCode on May 6th Sunday 2017
//

#include <iostream>

typedef unsigned char u_char;  // u_char型の宣言
typedef struct {
    int HuffBit;  // ハフマン符号のビット長
    int HuffCode; // ハフマン符号
    int HuffVal;  // ハフマン符号の意味する値
} HUFFTAB;  
// これでHUFFTABという型を宣言した

void outbit(const int& hc, const int& hb) {
// 16 bitsの長さ hbのハフマン符号 hcを左詰めで出力する
    
    int mask = 0x0001;
    for (int i=hb; i>0; i--) {
        mask <<= (i-1);
        if ((mask & hc) != 0) {
            std::cout << '1';
        } else {
            std::cout << '0';
        }
        mask = 0x0001;
    }
    std::cout << std::endl;
};

int main(int argc, char* argv[])
{
    u_char BITS[16];  
    // それぞれのビット長のハフマン符号がいくつあるか
    // 常に16バイトなので静的に配列確保した
    
    // データのセット 実際のプログラムではファイルから読み込む
    for (int i=0; i<16; i++) {  // データをセット
        BITS[i] = 0x00;
    }
    BITS[0] = 0x01; BITS[1] = 0x05; BITS[2] = 0x01;
    BITS[3] = 0x01; BITS[4] = 0x01; BITS[5] = 0x01;
    BITS[6] = 0x01; BITS[7] = 0x01;
    
    int huffElementNo = 0;
    for (int i=0; i<16; i++) {
        huffElementNo += BITS[i]; 
        // これでハフマン符号語の総数を求める
    }
    //
    // ハフマンテーブル領域の動的確保
    HUFFTAB *ht = new HUFFTAB[huffElementNo];
    // これでハフマン表の領域が確保された
    
    int code = 0;  // ハフマン符号初期値は0である
    int huffElement = 0;  // 配列のカウンター
    for (int i=0; i<16; i++) { 
        // これでBitS[]配列全体を走査する
        for (int j=0; j < BITS[i]; j++) {
            ht[huffElement].HuffBit = i+1;
            ht[huffElement].HuffCode = code;
            ht[huffElement].HuffVal = 0;  
            // とりあえずdummyで0を入れておく
            huffElement++;
            code+=1;  
            // 次のハフマン符号のために1 bit足す
        }
        code <<= 1;  
        // 次のビット数のハフマン符号のために、左に1 bitシフト
    }
    
    for (int i=0; i < huffElementNo; i++) {
        std::cout << "Bit = " << ht[i].HuffBit << " ::: Code = " << " ";
        outbit(ht[i].HuffCode, ht[i].HuffBit);
    }
    
    char ch = NULL;
    while (ch != 'e') {
        std::cin >> ch;
    }
    return 0;
}

きちんと動作しました この例では結果は

Bit = 2 ::: Code =  00
Bit = 2 ::: Code =  01
Bit = 2 ::: Code =  10
Bit = 3 ::: Code =  110
Bit = 4 ::: Code =  1110
Bit = 5 ::: Code =  11110
Bit = 6 ::: Code =  111110
Bit = 7 ::: Code =  1111110
Bit = 8 ::: Code =  11111110

と出力されました

DICOM XAをビット列として読み込む – bitstring package

資料が少なく苦労しています IDLEを立ち上げて色々とトライしているのです

>>>import bitstring
>>>xa_bit = bitstring.ConstBitStream(filename = 'xa1.dcm')
>>>xa_bit
ConstBitStream(filename='xa1.dcm', length=149355168)
>>>
>>>xa_bit.find('0xFFC4', bytealigned=True)
(10352,)
>>>

というところまで来ました これで、bit列としてxa_bitに DICOM XA fileを読み込むことに成功しました

ちなみに、ここでの lengthは bitの総数であり、バイトで表せば 18,669,396バイト、つまり約18.7MBということになります

また、0xFFC4という dicom tagで byte境界で検索したところ、最初にヒットしたのが、10352 (bits) = 1294 Byteでした これが DHT (Define Huffman Table)のマーカーですね

西宮戎神社
親亀の背中に子亀

何はともあれ必要なのは Binary Editor

Binary Editorとして Windows上では 超有名ソフト Starlingというのがあります これはもちろん Free Softwareなのですが秀逸の出来なので、僕も以前 DICOM解析の時には随分とお世話になりました

さて、MacOSですが、 Xcodeでもできるという話なのですが、どうやったらば binaryとしてファイルを開けるか分かりません Web検索かけてもなかなかヒットしないのです それで、色々探すと、0XEDというソフトが良い、というのが書かれています しかし実際に立ち上げてみると、肝腎の binary 部分の検索ルーチンにバグがあり、うまいこと DICOM tagを検索できません

困り果て、これは Windowsで開発せねばならないかな? と思い始めた時に、最後にヒットしたのが HexFiendというソフトです あまり魅力的なインターフェースではないのですが、きちんと使えるソフトですので、これを用いていくことに決めました

少しだけ進展 – Pydicom

少しだけ進展しました DICOM-XA解析において、何が必要か? それがなかなかつかめなかったのです 自分で C++でプログラム書いてから既に数年が経過し、色々な知識が消え失せているのです
それでも少しずつ進みましょう

IDLE

これで IDLEに入りました

>>>import dicom #これで pydicom module読み込み

>>> df = dicom.read_file("XA1.dcm")
# これにより XA1.dcmという DICOM-XA fileをdf というオブジェクトに読み込み

>>>pixel_bytes = df.PixelData
#これにより XA1.dcmの中の画像データ部分を pixel_bytesというバイト配列に読み込みしました

あとはここから 1 byteずつ読み出してそれを JPEG Lossless decodingに渡せば良いはずです