わーあいっ 解決

これまで VisualStudio Codeのメニューが日本語であっのに、updateしてからメニューが英語になってしまいました 「どうしてだろう?」「どうやれば治るの?」とか小さな心臓で悩んでいたのです

でも本日解決策発見しました ここに書いてありました この通りしたところすぐに日本語メニューとなりました 目出度し めでたし

Python関数引数に関する考察

どうしても訳が分からないことがありました 要するに Pythonでの関数の名前空間が分かっていなかったのです 特にリストを引数で渡す場合です ここには、「リストの場合関数内部でグローバル変数を変化させれば、関数から出てもその変化は引き継がれる」というように記載されています

ところがこのテストプログラムではそのようにならないのです

from bitstring import ConstBitStream
from defTag import jpegTag

DHTs = []
print("DHTs: {}".format(id(DHTs))) #A

def searchTags(DHTs):
    xa = ConstBitStream(filename='xa1.dcm') #B
    print("DHTs: {}".format(id(DHTs)))
    DHTs = list(xa.findall(jpegTag['DHT'], bytealigned=True))
    print("DHTs: {}".format(id(DHTs))) #C


if __name__ == '__main__':
    searchTags(DHTs)
    print("DHTs = {0}".format(DHTs))

この場合、出力はA, B, Cの値(アドレス)が出力され、最後に゜カラリスト[]が出力されます そして興味深いことには A == Bであるにもかかわらず B != Cなのです つまり関数内で新たに変数が作成された訳です これは意図する動作ではありません そこで調べるとここに詳細に記載がありました これによれば、関数内で変数に変更を行えば、関数内の変数とグローバル空間の変数は同じアドレスを参照するようです そこで以下のテストを書きました

from bitstring import ConstBitStream
from defTag import jpegTag

DHTs = []
print("#A: {}".format(id(DHTs))) #A

def searchTags(DHTs):
    xa = ConstBitStream(filename='xa1.dcm')
    print("#B: {}".format(id(DHTs))) #B
    DHTs.extend(list(xa.findall(jpegTag['DHT'], bytealigned=True)))
    print("#C: {}".format(id(DHTs))) #C


if __name__ == '__main__':
    searchTags(DHTs)
    print("DHTs = {0}".format(DHTs))

これで走らせてみると当方での出力は以下の通りでした

#A: 4441990408
#B: 4441990408
#C: 4441990408
DHTs = [10352, 5398688, 6469600, 11807904, 17146912, 22482576, 27843824, 33224096, 38652544, 44104704, 49597104, 55103072, 60640800, 66181296, 71753056, 77315744, 82880880, 88431792, 93978432, 99509264, 105038752, 110572944, 116110208, 121646512, 127184304, 132726336, 138267056, 143811248]

これで意図した通りとなりました 要するに関数内で値を受け渡したいリストに変更を加えることにより関数内変数とグローバル変数が同じアドレスを参照したことにより参照渡しが実現された訳です

やったあ

Pythonで DICOM XAに挑む編です

XA fileは動画シネ(シネには限らず USなんかもですが・・・)をコマ(= Frame)毎にパラパラ漫画のように連続して記録してあります

そして、それぞれの Frameは Huffman Code圧縮されていて、その圧縮のキーはそれぞれの Frame毎に設定されています これは圧縮効率を最大にするためなのです

そこで、これを解読するためには、Frame毎に設定されている Huffman定義テーブル = Define Huffman Table (DHT)を検出し、フレーム毎に分離する必要があります

このため、まず行っていることはフレーム毎に分離するため、DHTを検出することです これをやってみました

from defTag import jpegTag
from bitstring import ConstBitStream
from defTag import jpegTag
DHT_address = []

xa = ConstBitStream(filename='xa1.dcm')
print(list(xa.findall(jpegTag['DHT'], bytealigned=True)))

これで以下のようなリストが出力されました

10352, 5398688, 6469600, 11807904, 17146912, 22482576, 27843824, 33224096, 38652544, 44104704, 49597104, 55103072, 60640800, 66181296, 71753056, 77315744, 82880880, 88431792, 93978432, 99509264, 105038752, 110572944, 116110208, 121646512, 127184304, 132726336, 138267056, 143811248]

これは xa1.dcmという DICOM XA fileの中の DHTの位置を表していることになります これを用いて Frame毎にファイルを切り分けて暗号解読すれば良いということになりますね

ちなみに、defTag.pyは以下のように定義しました

jpegTag = {
    'TAG': '0xFF',
    'DHT': '0xFFC4',
    'SOI': '0xFFD8',
    'EOI': '0xFFD9',
    'SOF': '0xFFC3',
    'SOS': '0xFFDA'

}

if __name__ == '__main__':
    print(jpegTag)
    print(jpegTag['TAG'], jpegTag['DHT'])

何事もうまくいかないな

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

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

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

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

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

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

こんなことも知らなかった

Ron先生に刺激され、少しというか一ヶ月間ぐらいサボっていた Pythonのプログラミングに本日取り組みました 朝から外来診療し、その後PCIでしたが、PCIは若者に任せ自分は Pythonでした

ツールは PyCharmと、VisualStudio Codeです なかなか VisualStudio Codeが使い勝手が良いです

  • やりたいこと
    • jpeg tagを使いまわしできるように一つのファイルにまとめ、使用する時に importする
  • ファイル1 = defineTag.py
    • これは importされるファイルであり、ここにjpeg tag定義をまとめる
  • ファイル2 = test_defineTag.py
    • これがメイン・ルーチンでありここから importする
# defineTag.py

jpegTag {
    'TAG': 0xFF,
    'DHT': 0xC4,
    'SOI': 0xD8,
    'EOI': 0xD9,
    'SOF': 0xC3,
    'SOS': 0xDA
}

if __name__ == '__main__':
    print(jpegTag)
    print(jpegTag['TAG'])

そしてこれを呼び出すメインです

#test_defineTag.py


from defTag import jpegTag

print(jpegTag)
print(jpegTag['TAG'])

これをターミナルから呼び出します

$ python test_defTag.py

そうすると、以下のように応答されます

{'TAG': 255, 'DHT': 196, 'SOI': 216, 'EOI': 217, 'SOF': 195, 'SOS': 218}
255

これで使いたい時に、jpegTagを呼び出せば良いということになります ここまで来るのに数時間必要でした

ばかだばかだばかだ

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

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

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

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

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

ヘロヘロと光明

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

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

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

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

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

今朝のツーリング

これから一泊で韓国です

今日は日曜日 実は昨日土曜日心穏やかな時間がありました

湘南モノレール大船から江ノ島駅までの中間点に「湘南深沢」という江ノ島モノレールの駅があります その駅から自宅に向かって数分の距離に「深沢」という交差点があり、その交差点周辺にはかつてダイエー系のスーパーがありましたが、既に潰れています しかし、Yamakaストアというスーパーが未だ頑張り、すごいことに湘南ボーリングというボーリング場が元気に頑張っています このYamakaストアの向かい、自宅から歩いても 10分かからない距離なのですが、そこに以前より一軒家の本屋さんがあったのです しかし本屋さんは今厳しいですよね ご多分にもれずこの本屋さんも店を閉じてしまったのです いきさつの詳細はもちろん知らないのですが、バス停でバスを待ちながらその本屋さんを見ていると、何だかいつの間にか喫茶店に変わっているのです 喫茶店といってもコンセプトが「本」と「Cafe」という感じです なかなか良い感じなのですが、中に入るのは少し気恥ずかしい感じがして、できてもう一年以上経つのにかかわらず一回も訪れて無かったのです それに何時も外から見てそんなにお客さんが入っているようには見えないのです

土曜日仕事を昼過ぎに片付け、自転車で早めに帰宅する途中 このCafeを訪れることに決めました 丁度店の前に自転車スペースがあり、そこに自転車をとめてヘルメットを持ちながら Cafeに入りました 最初何となく勇気が必要でしたが、店に入ると僕ぐらいの年齢のご主人でしょうか? が一人おられ「何になさりますか?」と聴いて来られました 見れば各テーブルには電源があり、また Free Wi-Fiも整備され、壁には色々な本が並べられ自由に閲覧可能でした そしてバックには 1980 – 90年代のジャズが軽くかかっているのです

すっかり馴染んだ空気となりました そして、壁の一角にある本が目についたのです それは「Webサービスのつくり方」という本でした そして、その本に付箋がついていて、「当店主人の兄の書いた本です」と記載があるのです この本の著者は 和田 祐介という方であり、Web programming 特に Perl programmerとして有名な方です 何とそんな方が身近な場所に住んでおられるのに驚きました

そして、よく見ると壁に並べられたたくさんの書籍はあらゆる分野のものですが、その中でも Web Programming関係の本が多くあるのです

結局一人でその Cafeで 2時間ぐらいゆったりと過ごしたのです また訪れるつもりです

そして今日は朝遅くまで寝坊しました 本日 20:00発の便でソウルに飛びます 明日は早朝から韓国のある病院でTAVIのプロクターです 明日の最終便で戻る予定です また忙しい時が始まります

Dive in Python

ついに思い切って参加しました しかも今回は会場が東京駅前の理研です 理研の AIPセンターです ちなみに AIPは何か?と言えば、「革新知能統合研究センター」のことで、AIP = Advanced Intelligence Projectのことだそうです

Stapy x 理研AIP

今回の研究会の中心は OSS (Open Source Software) = 基本的にソースコードを GitHubなどでインターネット上に公開しながら有志がインターネットで参加してし協同で優れたソフトを早く開発していくというもの このOSSの代表作が Linuxであり、また それこそ 統計ソフトRもそうですし、多数存在します

今日の開催場所理研 AIPというのは、東京駅八重洲口歩いて数分の場所に存在する巨大な奇麗で新しいビルの15階にあります 流石東京だと思わせるビルです

Coredo日本橋ビル

内容は OSSとして開発されているPandasという Pythonの数値計算の有名なライブラリに日本人として唯一開発に参加されている方の講演とか、日本で開発され、全世界に広がっている深層学習のためのPython Frameworkである CHAINERの開発に参画されている方の講演、そして Scikit-Learnによる Pythonでの機械学習のお話、そして理研の教授であられる先生による講演などとても難しいお話が並びました

本日のスタッフ

結局全てが終了したのは 9:15pm頃であり、全く休憩無しでした 終了し、すぐに消え去ろうとしたところ、懇親会(ビアバッシュ)入り口で「齋藤先生」と突然声をかけられました えっ えっ 何とこの StaPyの毎回の研究会運営の中心であられる岸さまでした

そして驚くことに、何と岸さんは EP班の村上部長の義理のお兄さんだったのです いやあ驚きました 世の中広いようで狭いのですねえ

もうすぐ開始です

東京駅より日本橋に向けて歩いて 10分 Credoと大きくビルに書かれた 19階建ての新しい大きなビル 上の方には Bank of Americaとか Merill-Lynchとか大きな文字がかかれていて「何だこれはアメリカの銀行集団ビルか?」と思える様相です

何れにしてもそこの 15階、これが一般の人々は 5階までしか上がれない構造なのですが、その入口を探すのも一苦労でした その 15階に理研の「革新知能統合研究センター」というのがあり、そこに天才たちがどうやら集まっており、集会室らしき壁の黒板には多分議論した跡なのでしょうか 理解不可能な複雑な数式が並んでいました

理研での Python勉強会

その中の広い会議室 これがスクール形式で僕は楽ちんな机がある席の前から二列目に座席を確保したのです もうすぐはじまるでしょう 参加者の会話を聴いていると「京都から新幹線で今ついた」とか言っておられる方もいらっしゃります 身なりは登山する人みたいです まあ僕ひどく汚い身なりですから人のことは言えません 楽しみです